我正在尝试与RestKit同步加载对象,为此我在后台线程上使用[anObjectLoader sendSynchronously]
。然后在RKObjectLoader
didFinishLoad:中,应用程序当前停在第一行:NSAssert([NSThread isMainThread], @"RKObjectLoaderDelegate callbacks must occur on the main thread");
查看documentation,sendSynchronously
类中的RKRequest
方法表示将同步请求请求并返回水合响应对象。
这是我的代码的快照:
RKObjectLoader *anObjectLoader = [self.objectManager loaderWithResourcePath:resourcePath];
NSLog(@"Response: %@", [anObjectLoader sendSynchronously]);
在控制台上:
*** Assertion failure in -[RKManagedObjectLoader didFinishLoad:], ...RestKit/Code/ObjectMapping/RKObjectLoader.m:423
使用 RestKit 进行同步通话是否可以?
是否有更好的方式发送同步请求?
我错过了什么吗?
答案 0 :(得分:2)
你永远不应该进行同步通话。使用send
方法并使用委托或块回调捕获响应。除此之外,此方法针对网络带宽使用进行了优化,并且还正确处理了线程。
顺便说一下,RKObjectLoader
需要主线程的原因是因为那是主对象上下文的位置。
答案 1 :(得分:1)
我最近有同样的问题。我想出了如何使用块发送同步调用,它实际上非常好。基本上你做任何你打算做的restkit调用,但不是将委托设置为self,而是使用usingBlock
。然后,在该块中,您可以处理来自API调用的各种响应。
阻止示例(APIUser是我编写的代表当前用户的类):
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/users/" stringByAppendingString:userName] usingBlock:^(RKObjectLoader* loader) {
loader.onDidLoadResponse = ^(RKResponse *response) {
NSLog(@"Response: \n%@", [response bodyAsString]);
};
loader.onDidLoadObjects = ^(NSArray *objects) {
APIUser *apiUser = [objects objectAtIndex:0];
};
loader.onDidFailWithError = ^(NSError *error) {
NSLog(@"Response: \n%@", [response bodyAsString]);
};
}];
我原来的问答can be found here。