更新 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:不要将对象保存在缓存中的主要内容,如果未能解决你的问题,请参考以下文章
Restkit + Coredata - NSFetchedResultsControllerDelegate 回调不会单独为更新操作触发