CoreData NSPredicate - PullRequest
       19

CoreData NSPredicate

0 голосов
/ 25 сентября 2018

Я преобразовал один из старых проектов из Swift 1 в Swift 4.2 (на основных этапах версии, все успешно собраны), который использует CoreData.

Теперь компилятор выдает ошибку ниже при попытке выполнить этот код:

let sortDescriptor = NSSortDescriptor(key: "dateModified", ascending: false)
let predicate = NSPredicate(format: "markAsDeleted == false")
if let itemInspections = item.inspections?.filtered(using: predicate).sortedArray(using: [sortDescriptor]) {
    label.text = "Items (\(itemInspections.count))"
}

Ошибка:

2018-09-25 17: 19: 06.606722 + 0200 AppName [538: 144354] - [_ NSFaultingMutableSet FilterOrderedSetUsingPredicate:]: нераспознанный селектор отправлен в экземпляр 0x17063afc0 2018-09-25 17: 19: 06.607861 + 0200 AppName [538: 144354] *** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [_ NSFaultingMutableSet FilterOrderedSetUsingPredicate:]: нераспознанный селектор, отправленный в экземпляр 0x170af *

*** Первый стек бросить вызов: (0x18f5d6fd8 0x18e038538 0x18f5ddef4 0x18f5daf4c 0x18f4d6d2c 0x100126ce0 0x10015fa10 0x10015fc18 0x195ff9268 0x19575f884 0x19575a4ac 0x1956fc158 0x1928ec274 0x1928e0de8 0x1928e0ca8 0x19285c360 0x1928833c0 0x1956f17a0 0x18f5849a0 0x18f582628 0x18f582a74 0x18f4b2d94 0x190f1c074 0x195764130 0x100110cb4 0x18e4c159c)

libc ++ abi.dylib: завершается с невыполненным исключением типа NSException

Любой указатель будет оценен.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Настоятельно рекомендуется повторно выбирать элементы с соответствующим дескриптором предиката и сортировки, а не делать это вручную .

Код предполагает, что существует подкласс NSManagedObject Inspection с отношением item и сущность, представленная item, имеет уникальный атрибут name

let sortDescriptor = NSSortDescriptor(key: "dateModified", ascending: false)
let predicate = NSPredicate(format: "item.name == %@ AND markAsDeleted == FALSE", item.name)
let fetchRequest : NSFetchRequest<Inspection> = Inspection.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = [sortDescriptor]
do {
    let itemInspections = try managedObjectContext.fetch(fetchRequest)
    label.text = "Items (\(itemInspections.count))"
} catch { print(error) }

И если вам нужно только количество отфильтрованных элементов, есть еще более эффективный API

let sortDescriptor = NSSortDescriptor(key: "dateModified", ascending: false)
let predicate = NSPredicate(format: "item.name == %@ AND markAsDeleted == FALSE", item.name)
let fetchRequest : NSFetchRequest<Inspection> = Inspection.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = [sortDescriptor]
do {
    let numberOfItemInspections = try managedObjectContext.count(for: fetchRequest)
    label.text = "Items (\(numberOfItemInspections))"
} catch { print(error) }
0 голосов
/ 10 октября 2018

Я закончил тем, что изменил тип проверок на NSSet и явным образом привел результат фильтрации (используя: _) -> изменив код следующим образом:

let sortDescriptor = NSSortDescriptor(key: "dateModified", ascending: false)
let predicate = NSPredicate(format: "markAsDeleted == false")        
if let itemInspections = NSSet(set: (item.inspections?.filtered(using: predicate))!).sortedArray(using: [sortDescriptor]) as? [Inspection] {
    inspectionsCountLabel.text = "Inspections (\(itemInspections.count))"
}

Спасибо за ваши комментарии, они указали мне направильное направление!

0 голосов
/ 28 сентября 2018

Старайтесь избегать явных строк для атрибутов сущности, также замените false на правильное выражение формата:

let sortDescriptor = NSSortDescriptor(key: "\#keyPath(YourClassHere.dateModified)", ascending: false)
let predicate = NSPredicate(format: "\#keyPath(YourClassHere.markAsDeleted) == @%", NSNummber(value: false))
if let itemInspections = item.inspections?.filtered(using: predicate).sortedArray(using: [sortDescriptor]) {
    label.text = "Items (\(itemInspections.count))"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...