在后台队列中运行多个api调用而不冻结UI?

时间:2014-12-09 10:47:39

标签: ios objective-c-blocks grand-central-dispatch nsoperationqueue nsmutableurlrequest

NSURL异步请求冻结,直到上一次api调用完成。 我们的项目需要将视频上传到服务器,我们正在使用GCD。但是,在上传完成之前,UI不应该冻结。所以,也有可能打电话给其他一些api。但是,在调用其他api时,这些新的api调用正在等待完成视频上传api调用以完成队列。

申请流程如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

     //api call for video upload is an NSMutableUrlRequest with Asynchronous completion handler.

     dispatch_async(dispatch_get_main_queue(), ^{

         //UI operations

         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

             //simple api call for getting minimal data/ validation ---  (Problem - This api is getting freeze until the video upload to complete).

           });

     });

});

2 个答案:

答案 0 :(得分:1)

如果您不希望最里面的调度等待视频完成,请将其移到该调度块之外,例如:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

     //api call for video upload is an NSMutableUrlRequest with Asynchronous completion handler.

     dispatch_async(dispatch_get_main_queue(), ^{

         //UI operations

     });

});

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    //simple api call for getting minimal data/ validation

});

我必须说,原始构造似乎暗示了视频和数据验证调用之间存在一些隐含的依赖关系,但如果没有,您可以使用类似上面的内容。如果您需要知道这两个单独的异步任务何时完成,您可以使用调度组。

答案 1 :(得分:0)

你看过AFNetworking了吗?它使用NSURLConnection / NSURLSession来发出请求,它们都是异步的。