创建一个等待输入的线程。

时间:2015-10-03 13:27:49

标签: ios multithreading wait

我今天早些时候提出了一个问题(find it here) 大数据到服务器,一个人评论并说一个后台任务 应该处理这份工作。

我假设他/她意味着一个线程应该处理任务。

所以现在我的问题是:如何创建一个等待输入的线程?

这个过程看起来像这样:

  1. 主线程(MT)告诉工作线程(WT)加载资产
  2. WT从资产中复制一大块数据并组装网络数据包
  3. WT发送网络数据包并等待
  4. WT等待MT告诉它何时重复步骤2到4
  5. 当数据完全传输后,线程就会被破坏。

    注意:我没有使用HTTP,我在TCP上使用TCP和我的自定义协议。

    说明: 我需要保持线程等待的原因是因为当我打开200MB或更大的非常大的资产时,需要一些时间来加载资产。

    资产数据越大,应用程序必须等待的时间越长。

    如果我只想要一个2MB的资产块,我必须加载资产,等待一段时间才能加载它,复制一块2MB,然后退出完成块。

    然后我发送数据,等待服务器发送ACK信号,然后重复该过程。

    这需要一些时间,网络活动显示应用程序无法执行任何操作,有几秒钟的死时间,这都是因为资产需要的时间加载。

    我上一个问题中的人说,最好在后台任务中加载资产而不是离开requestImageForAsset的完成块,只是让任务继续运行,直到块发送完毕,然后发送下一个块。

    我希望这可以解决任何进一步的混淆。

1 个答案:

答案 0 :(得分:1)

对你的问题的简短回答是,你不是。

每当主线程注意到需要加载资产时,它应该在调度队列上放置一个作业来加载资产。

https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/

如果您使用的是Swift或Objective-C,则不提。无论哪种方式,这都应该有意义:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // copy a chunk of data from the asset and assemble a network packet
    // send the network packet and wait
    dispatch_async(dispatch_get_main_queue(), ^{
        // inform the main thread that the information has been received.
    });
});

另请查看此资源:http://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1