更新 RestKit:loadObjectsAtResourcePath:usingBlock:不要将对象保存在缓存中

Posted

技术标签:

【中文标题】更新 RestKit:loadObjectsAtResourcePath:usingBlock:不要将对象保存在缓存中【英文标题】:updating RestKit: loadObjectsAtResourcePath: usingBlock: don't save objects in cache 【发布时间】:2012-05-04 10:15:57 【问题描述】:

我在一个使用 RestKit 的项目中。在我们决定升级到 0.10.0 之前,我们一直使用 0.9.2 版本。在我的代码进行了一些小改动以使其与新版本的 RestKit 兼容后,我在使用 loadObjectsAtResourcePath: usingBlock: 时发现了一个错误。当我在委托中收到带有函数 -(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects 的响应时,对象数组具有正确的对象,但它们没有保存在 coreData 的缓存中。如果我尝试通过获取 coreData 来访问它们,我找不到它们。这是我使用的一些代码:

RestKit 的配置:

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:[NSURL URLWithString:@"http://myweb.com/web/app.php/ws"]];
objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = NO;
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"db.sqlite"];

    RKManagedObjectMapping* boAccount    = [RKManagedObjectMapping mappingForClass:[BOAccount class] inManagedObjectStore:objectManager.objectStore];
boAccount.primaryKeyAttribute        = @"boAccountID";
[boAccount mapKeyPathsToAttributes:  @"id", @"boAccountID",
                                     @"created_at", @"createDate",
                                     @"date_expiration", @"expirationDate",
                                     @"date_billing", @"billingDate",
                                     @"nb_authorized_devices", @"numberOfAuthorizedDevices",
 nil];
[objectManager.mappingProvider addObjectMapping:boAccount];
[objectManager.mappingProvider setMapping:boAccount forKeyPath:@"account"];

调用loadObjectsAtResourcePath: usingBlock:

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/connection" usingBlock:^(RKObjectLoader *loader)
    RKParams *params= [RKParams params];

    //[params setValue:_password.text forParam:@"password"]; 
    [params setValue:[Encrypt encryptWithPublicKeyMessage:_password.text] forParam:@"password"];
    [params setValue:_email.text forParam:@"email"];
    [params setValue:udid forParam:@"udid"];
    [params setValue:name forParam:@"name"];

    loader.delegate = self;
    loader.params= params;
    loader.method= RKRequestMethodPOST;

 ];

-(void)objectLoaderDidFinishLoading:(RKObjectLoader *)objectLoader

BOAccount* account;
NSArray* accounts = [BOAccount allObjects];
account = [accounts objectAtIndex:0];

但数组帐户为空。我也试过 -(void)objectLoaderDidFinishLoading:(RKObjectLoader *)objectLoader 但它给了我相同的结果。我知道我可以使用数组对象获得我想要的对象,但我需要在数据库中为我的项目保存对象。我知道对象被很好地解析了,因为我看到了 objectLoaderDidFinishLoading 的数组对象并且一切正常。

有人知道发生了什么吗?更新前此功能正常!

更新: 我发现如果我从模拟器或 iPad 中删除应用程序,有时它会在下一次工作......我认为它可以帮助找到答案。是不是我在 RestKit 放入缓存之前尝试使用这些项目?

【问题讨论】:

【参考方案1】:

您需要手动将对象保存到 CoreData 的数据库中:

    loader.onDidLoadObjects = ^(NSArray *objects) 
        // Save:
        NSError* error = nil;
        [[RKObjectManager sharedManager].objectStore.managedObjectContextForCurrentThread save:&error];
        if (error) 
            NSLog(@"Save error: %@", error);
        
     

【讨论】:

以上是关于更新 RestKit:loadObjectsAtResourcePath:usingBlock:不要将对象保存在缓存中的主要内容,如果未能解决你的问题,请参考以下文章

更新 arm64 的 restkit

从 RestKit 0.10 更新到 0.20

RestKit 更新到 xcode 4.4.1 后的警告

Restkit + Coredata - NSFetchedResultsControllerDelegate 回调不会单独为更新操作触发

在 coredata 和 restkit 本地更新托管对象的属性

RestKit/CoreData 未更新 - 创建重复项