2017-03-02 60 views
0

我正在使用RestKit 0.27.0,并设法设置我的核心数据堆栈,几乎和RestCits GitHub中的TwitterCoreData示例中一样。RestKit putObject - 它是否应该为我持久化回到Core Data存储?

我也映射了GET/POST请求,这些请求正确地持久化了核心数据中的对象,虽然我在处理PUT请求时遇到了问题。

看来我的PUT请求正在更新服务器上的对象,并且我可以看到它在响应中更新了。然后我去刷新期望实体已经更新的SQLite数据库查看器,但它没有。

以addressLine1为例,它被设置为:“4 Some Address”。然后我将它更新为NSManagedObject上的“4 TEST THIS CHANGE”并将它作为PUT上的对象传递。

我可以看到在日志中执行以下操作:

2017年3月2日15:05:18.006阿尔伯特[41779:1232025] T, restkit.object_mapping:RKMappingOperation.m:748跳过映射 从的keyPath属性值“addressLine1到的keyPath‘addressLine1’ - 值不变(4测试此更改)

它几乎一样,如果因为我已经更新的NSManagedObject的addressLine1值,即RestKit不捡起它作为一个改变?

当我重新登录到我的应用程序时,它执行GET请求,当它获得Object时,它意识到瞬态对象与存储在CoreData中的实体之间存在差异,因此可以更新它。

我找不到任何putObject:文档,可以帮助我了解哪里出错了,所以基于RestKit的最新版本(截至编写时为0.27.0) - 这将是件好事通过引用现有NSManagedObject开始,提供或引导到一个示例,更新其上的属性(属性),然后将其作为参数发送到PUT请求中。我认为RestKit“应该”为我处理Core Data的持久性,就像它在GET和POST请求上一样。

回答

0

看起来我误解了RestKit与CoreData的搭配。

本来我是第一次做必要的更新对象,然后做这样的PUT请求:

[[RKObjectManager sharedManager] putObject:myObjectWithChanges 
           path:path 
           parameters:nil 
    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

我以为,通过它传递的NSManagedObject与变化,它会正常工作。它确实更新了服务器,但是在更新CoreData中的实体时会搞砸 - 似乎RestKit认为它已经是最新的,因为我更新了本地NSManagedObject。

所以不是我决定尝试用零的对象,并通过改变作为参数的字典(这是不提供RestKit对象的要求,如果你提供了一个路径):

NSDictionary *dict = @{ 
         @"addressLine1":@"4 TEST THIS CHANGE 11", 
         @"addressLine2":@"Address line 2", 
         @"postCode":@"WN7 5GB" 
         }; 

[[RKObjectManager sharedManager] putObject:nil   
           path:path 
           parameters:dict 
    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

使用这个PUT允许我更新服务器上的对象和Core Data中的本地实体。

我只能假设putObject:中的“对象”只是告诉RestKit它是哪个对象,因此RestKit可以选择合适的请求/响应描述符进行路由。这是parameters:参数,必须对所述对象进行任何更改。

注:它也是优良把你的对象到调用就像这样:

NSDictionary *dictWithChanges = @{ 
             @"addressLine1":@"Change here" 
            }; 

    [[RKObjectManager sharedManager] putObject:myObjectWithoutChanges   
            path:path 
            parameters:dictWithChanges 
     success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

看来,RestKit将合并与对象参数的变化并重建请求。

相关问题