RestKit + CoreData,理解 RKManagedObjectRequestOperation
Posted
技术标签:
【中文标题】RestKit + CoreData,理解 RKManagedObjectRequestOperation【英文标题】:RestKit + CoreData, understanding RKManagedObjectRequestOperation 【发布时间】:2015-03-26 17:50:45 【问题描述】:我正在使用 RestKit 将 API 映射到 CoreData 实体。 我的问题是关于映射/保存的工作时间,因为我的代码没有按预期工作。
目前,请求已成功完成,但是当我调用 self.getUsers()
时,它仍然在我的 CoreData DataModel 中显示 0
对象。
但是,当我重新运行应用程序并在文件顶部打印 self.getUsers() 时,我看到了我的用户!因此,保存正在发生,就在我的self.getUsers()
行运行之后......
我误解了 User
NSManagedObject 实际被保存的时间,因为我认为我对 self.getUsers()
的调用在链中发生得太早了。
这是我的代码,可以帮助您理解:
var request: NSURLRequest = NSURLRequest(URL: NSURL(string: "MY_API_URL_HERE")!)
var operation: RKManagedObjectRequestOperation = RKManagedObjectRequestOperation(request: request, responseDescriptors: [responseDescriptor])
operation.managedObjectContext = managedObjectStore.mainQueueManagedObjectContext
operation.managedObjectCache = managedObjectStore.managedObjectCache
operation.setCompletionBlockWithSuccess( (operation: RKObjectRequestOperation!, result: RKMappingResult!) -> Void in
println("Success with result: \(result)")
var user: User = (result.array() as NSArray).firstObject as User
// Calls a func that makes an NSFetchRequest on the 'User' Entity
self.getUsers()
, failure: (operation: RKObjectRequestOperation!, error: NSError!) -> Void in
println("Failed with error: \(error.localizedDescription)")
)
然后是 getUsers 函数:
func getUsers()
var fetchRequest = NSFetchRequest(entityName: "User")
if let fetchResults = self.appDelegate.context.executeFetchRequest(fetchRequest, error: nil) as? [User]
println(fetchResults.count)
if (fetchResults.count > 0)
for managedObject:User in fetchResults
println("Found user")
println(managedObject.valueForKey("id"))
【问题讨论】:
什么是appDelegate.context
,它与 RestKit(托管对象存储)使用(和拥有)的上下文有何关系?
啊,这就是我在集成 RestKit 之前查询核心数据的方式。 context
在 AppDelegate 中定义为 self.managedObjectContext
。但我认为我现在必须使用 RestKit 使用的上下文?
查询时如何获取正确的上下文?
我将 self.appDelegate.context 更新为 RKObjectManager.sharedManager().managedObjectStore.mainQueueManagedObjectContext
,它似乎正在工作!感谢您朝着正确的方向推动@Wain
【参考方案1】:
Restkit 维护自己的托管对象上下文(层次结构),因此您需要确保使用适当的上下文。托管对象存储(您通常只有一个,可能由多个对象管理器使用)提供mainQueueManagedObjectContext
,因此使用以下方式访问它:
[[RKManagedObjectStore defaultStore] mainQueueManagedObjectContext]
【讨论】:
这是我现在使用的。以上是关于RestKit + CoreData,理解 RKManagedObjectRequestOperation的主要内容,如果未能解决你的问题,请参考以下文章