使用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到完成块。)
  • waitUntilFinished会阻止你在线的任何线程,所以确保它不是主线程。
  • 如果您需要帮助创buildrequest ,请参阅RKObjectManager类参考中的创build请求对象 。
  • 再一次,如果你可以重写你的代码asynchronous工作,那可能会比这个解决scheme更好。

您需要拥抱networking通信的asynchronous性质和响应的后台处理,或者使用不同的API /技术专门用于进行同步请求。 RestKit和AFNetworking基于前者。

拥抱asynchronous是最好的select…

也就是说,可以使用RestKit创buildNSURLRequest ,然后使用NSURLConnection同步下载响应,然后使用RKMapperOperation执行映射(并等待addOperations:waitUntilFinished:完成)。