#ios #swift #xcode
#iOS #быстрый #xcode #swift
Вопрос:
Итак, перенос моего кода на Swift 3
меня немного застрял. Кажется NSBatchDeleteRequest
, требуется iOS 10
сейчас? Единственный способ, которым я мог бы выполнить сборку кода, — это следующий фрагмент:
func removeAllChargerData(){
// Remove all charging data from persistent storage
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = ChargerPrimary.fetchRequest()
let entity = NSEntityDescription.entity(forEntityName: "ChargerPrimary", in: self.secondMoc)
fetchRequest.entity = entity
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try self.secondMoc.execute(deleteRequest)
} catch {
let deleteError = error as NSError
NSLog("(deleteError), (deleteError.localizedDescription)")
}
}
Однако появляется предупреждение, указывающее, что fetchRequest()
доступно только в iOS 10
и новее. Если я определяю fetchRequest
следующий способ, я получаю сообщение об ошибке, потому что он ожидает fetchRequest
, что у to есть NSFetchRequestResult
тип аргумента:
let fetchRequest = NSFetchRequest<ChargerPrimary>(entityName: "ChargerPrimary")
Комментарии:
1. у меня тоже такая же путаница. К сожалению, документации от Apple по этому поводу нет — думаю, они были слишком заняты, предоставляя все эти новые удобные функции, настолько понятные.
2. Тем не менее, это довольно важная функция, которая, похоже, не осталась полностью сломанной. :/ И, учитывая количество времени, которое Swift 3 и Xcode 8 провели в бета-версии, я не могу понять, что это понятное упущение.
3. Ваша проблема заключается только в общем запросе на выборку, а не в пакетном удалении как таковом
Ответ №1:
Вам просто нужно указать правильный тип для общего:
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ChargerPrimary")
Комментарии:
1. Но можете ли вы использовать это с NSBatchDeleteRequest в iOS 9? Я подозреваю, что ответ сейчас, и это актуальный вопрос здесь: как использовать NSBatchDeleteRequest в Swift 3 с iOS 9.
2. @Zygote Я только что протестировал на симуляторе iOS9.3, и, похоже, он работает нормально. Какие у вас проблемы с этим?
Ответ №2:
Вероятно, это также работает для меня в IOS 10
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ChargerPrimary")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
Вы должны использовать fetchrequest подобным образом, не указывая конкретный тип для varible
Вот ДЕМО-версия для IOS 9
Комментарии:
1. Да, если вам нужна документация, я предоставлю вам ссылку
2. @Zygote Ты получил то, что хотел, по этой ссылке?
3. Мне нужно будет проверить это позже, но я подозреваю, что ссылка, которую вы разместили, предназначена для Swift 2, поскольку она датирована 2015 годом. Просто для уточнения: NSBatchDeleteRequest отлично работал для меня с Swift 2, но в Swift 3 я могу заставить его работать только для iOS 10.