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的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 直接 + 反向关系映射

RestKit 与直接 CoreData

RestKit 和 Coredata

无法使用 CoreData 配置 RestKit

RestKit + CoreData:从CoreData缓存中排除某些对象

CoreData 和 RestKit