2

我正在尝试使用 RestKit 同步加载对象,并[anObjectLoader sendSynchronously]在后台线程上使用。然后在RKObjectLoader didFinishLoad:应用程序当前停止在第一行:NSAssert([NSThread isMainThread], @"RKObjectLoaderDelegate callbacks must occur on the main thread");

查看文档,该类中的sendSynchronously方法RKRequest说请求将被同步请求,并且将返回一个水合响应对象。

这是我的代码的快照:

RKObjectLoader *anObjectLoader = [self.objectManager loaderWithResourcePath:resourcePath];
NSLog(@"Response: %@", [anObjectLoader sendSynchronously]);

在控制台上:

*** Assertion failure in -[RKManagedObjectLoader didFinishLoad:], ...RestKit/Code/ObjectMapping/RKObjectLoader.m:423

可以将RestKit与同步调用一起使用吗?
有没有更好的方法来发送同步请求?
我错过了什么吗?

4

2 回答 2

2

你永远不应该进行同步调用。使用该send方法并使用委托或块回调来捕获响应。除其他外,此方法针对网络带宽使用进行了优化,并且还可以正确处理线程。

顺便说一句,RKObjectLoader需要主线程的原因是因为这是您的主对象上下文所在的位置。

于 2012-08-07T07:57:50.423 回答
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]);          
    };
}];

我原来的问题和答案可以在这里找到

于 2012-08-08T16:17:28.183 回答