NSBatchDeleteRequest в Swift 3 только для iOS 10?

#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.