Как «уменьшить» массив [NSManageObject] до выбранной сущности? - PullRequest
0 голосов
/ 04 ноября 2018

Я занимаюсь разработкой приложения с использованием CoreData.

У меня есть 5 сущностей (A, B, C, D, E), и 90% атрибутов каждой сущности являются общими. 10% разные.

Я создал массив [NSManageObject] для хранения fetchRequest выбранного объекта. До этого момента все работает.

Вот мой код fetchRequest. Прежде всего я сделал расширение NSManagedObjectContext:

extension NSManagedObjectContext {

func fetchMOs (_ entityName: String, sortBy: [NSSortDescriptor]? = nil, predicate: NSPredicate? = nil) throws -> [NSManagedObject] {

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)

    request.returnsObjectsAsFaults = false
    request.predicate = predicate
    request.sortDescriptors = sortBy

    return try! self.fetch(request) as! [NSManagedObject]

    }
}

Затем я запрашиваю данные, вызывая эту функцию в контексте:

documentArray = try! context.fetchMOs(requestedEntity!, sortBy: requestedSortBy, predicate: requestedPredicate)

Проблема возникает, когда я хочу получить доступ к атрибутам выбранного объекта для работы с ними.

Например, я выбрал сущность A, и fetchRequest сохранил данные в массиве [NSManageObject]. Теперь я хочу напечатать один атрибут объекта: [NSManageObject] .attribute1 <- но это неверно. Должно быть: [A] .attribute1 </p>

Полагаю, я мог бы сделать оператор switch для downcast и работать с данными:

Switch entitySelected {
   Case “A”:
      arrayOfMO as! [A]
      arrayOfMO.attribute1 ......

И так для каждой сущности. Но мне кажется, что должен быть более чистый способ сделать это.

Данные, хранящиеся в объектах, являются строками, и я хочу с ними просто заполнить метки и кнопки в tableViewController.

Спасибо.

1 Ответ

0 голосов
/ 09 ноября 2018

Попробуйте следующее:

    extension NSManagedObjectContext {
        func fetchMOs<T: NSManagedObject>(sortBy: [NSSortDescriptor]? = nil, predicate: NSPredicate? = nil) throws -> [T] {

            let request = NSFetchRequest<T>(entity: T.entity())

            request.returnsObjectsAsFaults = false
            request.predicate = predicate
            request.sortDescriptors = sortBy

            return try? self.fetch(request) ?? []
        }
    }

Тогда вы можете получить

    let results: [SomeMoClass] = moc.fetchMOs<SomeMoClass>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...