【问题标题】:GCD and ThreadsGCD 和线程
【发布时间】:2014-05-21 15:20:04
【问题描述】:

我想了解一些关于 GCD 和线程的知识。

我的视图控制器中有一个 for 循环,它要求我的模型执行一些异步网络请求。

所以如果循环运行 5 次,模型会发出 5 个网络请求。

考虑到我正在使用 NSURLConnection 的 sendAsyncRequest 并且将在另外 5 个线程上调用完成处理程序这一事实,声明我的模型创建了 5 个线程是否正确?

现在,如果我要求我的视图控制器在不同的线程上执行这个 for 循环,并且在循环的每次迭代中,对模型的调用应该依赖于上一次迭代,我会创建一个“初始”吗?线程在这里?

基本上,只有在前一个线程完全完成时,我才希望向我的服务器发出后续异步请求(完全是指它的所有子线程也应该完成执行。)

我什至无法正确地提出问题,因为我自己也很困惑。 但是,如果有人可以提供任何帮助,那将很有帮助。

【问题讨论】:

    标签: ios objective-c multithreading grand-central-dispatch


    【解决方案1】:

    一般情况下说创建了五个线程是不正确的。

    线程和块之间没有一对一的映射。 GCD 是线程池的一种实现。

    根据该设备的最佳设置创建一定数量的线程 - 在该操作系统版本下创建和维护线程的成本、可用处理器内核的数量、它已经拥有但目前被屏蔽以及 Apple 愿意考虑的任何其他因素都可能是相关的。

    然后,GCD 会将您的块分散到这些线程上。或者它可能会创建新线程。但不一定。

    除此之外,队列只是建立块之间排序的方法。串行调度队列不一定拥有自己的线程。所有并发调度队列不一定拥有自己的线程。但是没有理由相信任何一组队列共享任何线程。

    为块选择线程的确切方法在操作系统版本之间发生了变化。例如。 iOS 4 在线程创建方面非常挥霍,而 iOS 5+ 绝对没有。

    GCD 只会尝试在这种情况下做任何最好的事情。不要浪费时间去猜测它。

    【讨论】:

      【解决方案2】:

      “基本上,只有在前一个线程完全完成时,我才希望向我的服务器发出后续异步请求(完全是我的意思是它的所有子线程也应该完成执行。)”

      只关注上述陈述以避免混淆。简单的解决方案是创建一个队列。用 5 个循环喂给队列。每个循环都会同步发出网络请求(您可以使用 NSURLConnection 中提供的 sendSynchronousRequest: 方法),在请求完成后执行操作,然后开始下一个循环。 FIFO 之后的队列将随后执行您的请求。

      【讨论】:

        【解决方案3】:

        GCD :将其视为一个可以接受任务的简单队列。任务是代码块。您可以在队列中放入任意数量的任务(允许系统限制)。队列有不同的口味。并发与串行。主要与全球。高优先级与低优先级。队列不是线程。

        线程:它是单行代码按顺序执行。您可以让多个线程同时处理您的代码。线程不是队列。

        一旦你将这两个实体分开,事情就会变得清晰起来。

        GCD 基本上使用进程中的线程来处理任务。在串行队列中,所有内容都按顺序处理。所以你不需要在你的代码中有同步机制,串行队列的本质确保了同步。如果这是一个并发队列(即同时处理 2 个或更多任务,那么您需要确保代码的关键部分受到同步保护)。

        这是您排队等待完成的工作的方式。

        dispatch_async(_yourDispatchQueue, ^() {
            NSLog (@"work queued");
        });
        

        上面的 NSLog 现在将在不久的将来在后台线程中执行,但在后台线程中。

        如果您注意到我们提出请求时,我们会使用 dispatch_async。另一个变体是 dispatch_sync。 2 之间的不同之处在于,在您将请求放入队列后,异步变体将继续进行。同步变化不会!

        如果你打算为 NSURLConnection 使用 GCD,你需要小心在哪个线程上启动连接。这是一个 SO 链接以获取更多信息。 GCD with NSURLConnection

        【讨论】:

          猜你喜欢
          • 2013-04-24
          • 2011-11-09
          • 1970-01-01
          • 2018-11-07
          • 2015-08-04
          • 2011-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多