为什么带有.dictionaryResultType的NSFetchRequest不返回结果而没有dictionaryResultType的请求却返回结果?

时间:2018-09-17 20:51:57

标签: ios swift core-data nsfetchrequest

当我使用.dictionaryResultType执行NSFetchedRequest时,没有任何结果。如果我不使用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
    }
}

当我使用dictionaryResultType时,提取始终返回0个结果,但是如果我将提取方式更改为不使用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来减少应用程序的内存占用,因为请求可以传递数千个对象,并且实体中具有一些大属性)。

0 个答案:

没有答案