【问题标题】:Creating a thread that waits for input.创建一个等待输入的线程。
【发布时间】:2015-10-03 13:27:49
【问题描述】:

我今天早些时候问了一个关于发送的问题 (find it here) 大数据到服务器,一个人评论说是后台任务 应该处理这项工作。

我假设他/她的意思是一个线程应该处理任务。

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

该过程将如下所示:

  1. 主线程 (MT) 告诉工作线程 (WT) 加载资产
  2. WT 从资产中复制一大块数据并组装一个网络数据包
  3. WT发送网络包并等待
  4. WT 等待 MT 告诉它何时重复步骤 2 到 4

当数据传输完毕后,线程被销毁。

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

解释: 我需要让线程等待的原因是,当我打开一个 200MB 或更大的非常大的资产时,加载资产需要一些时间。

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

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

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

这需要一些时间,并且网络活动显示应用程序在几秒钟内没有执行任何操作,这完全是因为加载资产需要时间。

我上一个问题中的人说,最好将资产加载到后台任务中,而不是离开requestImageForAsset 的完成块,并简单地保持任务运行直到发送块,然后发送下一个块.

我希望这能消除任何进一步的困惑。

【问题讨论】:

  • 不确定您的等待和分块逻辑,但如果您不需要非常低级别的控制,我建议 NSOperationQueue 是一个有用的线程抽象。
  • @PhillipMills 如果您愿意,我可以准确地解释我在做什么。我真的不需要任何低级的东西。我只需要一个沿着主线程运行并保持活动状态的任务,直到主线程告诉它做某事。

标签: ios multithreading wait


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

【讨论】:

  • 但我必须这样做。我已经更新了解释为什么我需要让线程等待的问题。
  • 我已经阅读了您的更新,不,您不需要手动保持线程处于活动状态。操作系统会为您处理这些细节。
  • 我已阅读您的最新更新。我的答案仍然是正确的答案。我提供的代码将一个任务放在后台线程上,让它运行而不会干扰主线程的 UI 作业,只要它需要。这个答案与网络调用无关,与你如何在 iOS 中创建和管理线程有关。
  • 哦,好的。但如果我问你这个问题:线程会存活多久?
  • 它会在其中的代码执行后立即终止吗?我需要以某种方式让它保持活力并等待命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多