【问题标题】:Make main thread wait until all other threads done in IPhone sdk让主线程等到所有其他线程在 iPhone sdk 中完成
【发布时间】:2013-01-09 09:34:18
【问题描述】:

在我的编码经验中,我第一次在目标 C 中处理线程。在我的应用程序中,我需要在两个线程中下载一些资产。下载完成后,我必须启动我的主线程,这将在线程中使用下载的资产。所以我写了一些这样的代码

NSThread *threadPlayer1 = [[NSThread alloc]initWithTarget:self selector:@selector(getPlayer1Assets) object:nil];
            
[threadPlayer1 start];
            
NSThread *threadPlayer2 = [[NSThread alloc]initWithTarget:self selector:@selector(getPlayer2Assets) object:nil];
            
[threadPlayer2 start];

[self performSelectorOnMainThread:@selector(introducePlayer1) withObject:nil waitUntilDone:YES];

我将 waituntilDone 写为 Yes,但它只等到第一个线程完成。 所以如果我想等到所有两个线程都完成我该怎么办?任何人都可以用示例代码 sn-ps 提出建议。

【问题讨论】:

  • 我认为从根本上讲,您的线程架构在这里被破坏:阻塞主线程会使其在阻塞时对事件无响应。相反,您应该使用的模式是将完成通知发布到主线程。

标签: ios objective-c multithreading ios4


【解决方案1】:

我的建议是使用this。它来自脉冲工程博客。花一点时间在里面,直到你掌握了这个想法。

至于您的代码。我猜你正在这样做:

[self performSelectorOnMainThread:@selector(introducePlayer1) withObject:nil waitUntilDone:YES];

在主线程上。阅读documentation 上的相关内容,特别是最后一句话:

wait 一个布尔值,指定当前线程是否阻塞直到 在主上的接收器上执行指定的选择器之后 线。指定 YES 来阻塞这个线程;否则,指定否 让这个方法立即返回。

如果当前线程也是主线程,并且你为 此参数,消息立即传递和处理。

【讨论】:

  • 链接已失效;这是一个糟糕的答案。
  • @GrahamPerks 没有一个链接是死的家伙。 :S
  • eng.alphonsolabs.com 链接出现“Safari 找不到服务器”。无论如何,链接可能会失效,因此“链接到答案”的答案很脆弱且形式不佳。
猜你喜欢
  • 2020-09-21
  • 1970-01-01
  • 2014-10-05
  • 2021-07-11
  • 2010-12-26
  • 1970-01-01
  • 2019-06-22
  • 2012-07-22
  • 1970-01-01
相关资源
最近更新 更多