使用RestKit执行同步请求
- (BOOL)do_a_Restkit_request_and_return_a_boolean { [manager postObject:nil path:@"/mypath" parameters:@{@"password":password} success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { myResult = [mappingResult firstObject] == 5; } failure:^(RKObjectRequestOperation *operation, NSError *error) { }]; return myResult; }
你好我想做一个RestKit调用像上面的同步,以便在成功块的调用后返回myResult。
你可以使用这样的方法:
NSMutableURLRequest *request = // create a request… RKObjectRequestOperation *operation = [manager objectRequestOperationWithRequest:request success:nil failure:nil]; [operation start]; [operation waitUntilFinished]; BOOL myResult = NO; if (!operation.error) { myResult = [operation.mappingResult firstObject] == 5; } return myResult;
笔记:
- 完成块在操作完成后调用,所以如果提供了成功/失败块,它们将不会被调用,直到方法返回
- (这就是为什么我build议你通过
nil
到完成块。)
- (这就是为什么我build议你通过
-
waitUntilFinished
会阻止你在线的任何线程,所以确保它不是主线程。 - 如果您需要帮助创build
request
,请参阅RKObjectManager类参考中的创build请求对象 。 - 再一次,如果你可以重写你的代码asynchronous工作,那可能会比这个解决scheme更好。
您需要拥抱networking通信的asynchronous性质和响应的后台处理,或者使用不同的API /技术专门用于进行同步请求。 RestKit和AFNetworking基于前者。
拥抱asynchronous是最好的select…
也就是说,可以使用RestKit创buildNSURLRequest
,然后使用NSURLConnection
同步下载响应,然后使用RKMapperOperation
执行映射(并等待addOperations:waitUntilFinished:
完成)。