ios - 在后台队列中运行多个 api 调用而不卡住 UI?

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

           });

     });

});

最佳答案

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

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

});

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

关于ios - 在后台队列中运行多个 api 调用而不卡住 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27377048/

相关文章:

ios - 这个 run_on_main() 宏有什么问题吗?

ios - Flutter 构建 ios bitcode 问题,如何修复 bitcode 错误

ios - 在我的 iOS 应用程序中使用 https (SSL) 连接

ios - CFStringTransform 和 Swift 3 中 'init' 的使用不明确

objective-c - 如何调用接受 block 字典作为 Swift 参数的 Objective-C 函数?

objective-c - Objective-C - 如何实现自定义回调方法但强制执行特定参数?

ios - EXC_BAD_INSTRUCTION 在 dispatch_get_current_queue()

ios - 分派(dispatch)到主线程时返回值

ios - 在 Playground 中编译正常的编译器错误

objective-c - block 捕获对象的过度释放问题;保留计数从 +2 直接跳到 0!