Почему NSFetchRequest с .dictionaryResultType не возвращает результаты, в то время как запрос без dictionaryResultType делает? - PullRequest
0 голосов
/ 17 сентября 2018

Когда я делаю NSFetchedRequest с использованием .dictionaryResultType, я не получаю никаких результатов.Если я делаю тот же запрос на выборку, не используя dictionaryResultType, я получаю результаты.

Вот что я делаю:

Я создаю сущность в viewcontext следующим образом:

class func createNew(in context: NSManagedObjectContext) -> Picture? {
    let mo = Picture(context: context)
    mo.id = UUID.init()
    mo.created = timeStamp
    mo.modified = mo.created
    mo.user = SP.user        
    return mo
}

Изображение является NSManagedObject.

Контекст созданв классе CoreDataHelper, как это:

lazy var viewContext: NSManagedObjectContext = {
    let context:NSManagedObjectContext = self.persistentContainer.viewContext
    context.automaticallyMergesChangesFromParent = true
    context.undoManager = nil
    return context
}()

Я выбираю так:

static var removedSinceLastSync: [[String:Any]]? {
    let context = CDH.shared.viewContext
    let req = NSFetchRequest<NSFetchRequestResult>(entityName: Picture.className)
    req.resultType = NSFetchRequestResultType.dictionaryResultType
    req.propertiesToFetch = ["id", "removed"]
    let lastSyncForTable =  0
    let predicate = NSPredicate(format: "removed > %i", lastSyncForTable)
    req.predicate = predicate

    do {
        let results = try context.fetch(req)
        if results.count > 0 {
            return results as? [[String: Any]]
        }
        return nil
    } catch let error as NSError {
        print(error)
        return nil
    }
}

Выборка всегда возвращает 0 результатов, когда я использую dictionaryResultType, но если я изменю выборку на неиспользуйте dictionaryResultType, он всегда возвращает вновь добавленный управляемый объект как результат:

static var removedSinceLastSync: [Picture]? {
    let context = CDH.shared.viewContext
    let req = NSFetchRequest<NSFetchRequestResult>(entityName: Picture.className)

    let lastSyncForTable =  0
    let predicate = NSPredicate(format: "removed > %i", lastSyncForTable)
    req.predicate = predicate

    do {
        let results = try context.fetch(req)
        if results.count > 0 {
            return results as? [Picture]
        }
        return nil
    } catch let error as NSError {
        print(error)
        return nil
    }
}

Интересно, что если я сохраняю контекст после добавления нового управляемого объекта, выборка с dictionaryResultType действительно возвращает результат.Итак, у меня есть два возможных решения, но мне не нравится ни одно из них.

Я наткнулся на ошибку (используя Xcode 10 GM) или это ожидаемое поведение?Если ожидаемое поведение, почему, и есть ли другой способ получить только два интересующих меня атрибута, не сохраняя контекст раньше, но по-прежнему используя dictionaryResultType.(Я предпочитаю использовать dictionaryResultType, чтобы уменьшить объем памяти приложения, поскольку запрос может доставлять тысячи объектов, а сущность имеет некоторые большие атрибуты).

...