ios - 为什么带有 .dictionaryResultType 的 NSFetchRequest 不返回结果,而没有 dictionaryResultType 的请求却返回结果?
问题描述
当我使用 .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 时,fetch 总是返回 0 个结果,但是如果我将 fetch 更改为不使用 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 来减少应用程序的内存占用,因为请求可以传递数千个对象,并且实体中有一些大属性)。
解决方案
推荐阅读
- node.js - 我的快递应用程序的路由不起作用
- git - git log 条目中提交行的解释
- python - 如何在 Python 中处理非常大的数字
- matlab - 从 3d 矩阵中提取数据
- java - Cooja 模拟器中的 Java 结果 134
- javascript - IE 能否在 JavaScript 返回的 CSS 内容属性值中保留反斜杠?
- c# - 确保从不同的读取线程看到写入
- detox - 无法在 IOS 应用程序的 detox 中使用深度链接 url 启动应用程序
- react-native - react native bundle 没有采用 Jenkins 提供的环境变量
- java - 在java中展平嵌套的N级嵌套对象