【问题标题】:In background queue run multiple api calls without freezing UI?在后台队列中运行多个 api 调用而不冻结 UI?
【发布时间】:2014-12-09 10:47:38
【问题描述】:

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).

           });

     });

});

【问题讨论】:

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


    【解决方案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
    
    });
    

    我必须说,原始结构似乎暗示视频和数据验证调用之间存在某种隐含的依赖关系,但如果不是,您可以使用类似上述的方法。如果您需要知道这两个独立的异步任务何时都完成,您可以使用调度组。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的帮助,但我们正处于申请的最后阶段,到此阶段我们无法迁移到 AFNetworking。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      相关资源
      最近更新 更多