2012-04-09 67 views
0

我正在寻找iOS中多线程的等效模式,因为在.NET中有用于脉冲和等待的模式。本质上,我想要一个后台线程置于休眠状态,直到设置了一个标志,这实际上是“踢”线程的行为。iOS等效于脉冲和等待线程

它是loop + thread.sleep()的替代方案。该标志可以设置在与执行处理的实际后台线程不同的线程上。谢谢!

+3

不要这样做,这是一个糟糕的模型。除非你有一些非常具体的理由关心哪个线程执行了一项工作,否则使用一个线程池。当您想完成一项工作时,将其排入池中。否则,您会浪费线程,浪费资源并强制执行额外的上下文切换。 – 2012-04-09 01:23:27

+0

有一些建议(NSThread,GCD的信号量等)。我喜欢David的建议,最好的方法是,不要设置一些其他线程正在等待检测更改的标志,只需执行一个简单的'dispatch_async()'即可开始执行处理的任何进程。没有麻烦。别大惊小怪。 – Rob 2012-04-09 02:15:26

回答

2

在iOS和OS X上有各种不同的混合和匹配线程API。您使用什么创建线程?

最简单的建议是使用Grand Central Dispatch (GCD) semaphore

设置代码:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 
// Then make sure your thread has access to this semaphore 

线程代码:

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
// Will block forever until the semaphore is triggered 

触发代码:

dispatch_semaphore_signal(semaphore); 

一个更好的建议:GCD已经管理自己的线程池,所以只取它的优点,而不是旋转自己的线程。使用dispatch_async在后台线程中运行一些代码非常简单。

0

我对.NET中的这种模式并不熟悉,但是有目的地锁定一个线程通常是一个坏主意(除非该线程无法继续,但它听起来像是希望它等待大部分时间或至少很长一段时间)。

这对调度程序不利,对系统资源不利。

您可以使用NSThread的+ detachNewThreadSelector:...方法来创建一个新的线程。您可以使用各种想法来尝试管理您的逻辑,在NSObject的-performSelectorOnMainThread中创建和维护这样的线程:...

+0

正确。基本上,我有一个后台调度程序,它以串行方式执行任务,但是在与主线程不同的线程中。这些任务中的每一个都依赖于Internet连接。如果互联网连接断开,我不想执行这些任务(或轮询)。我希望它暂停并等待互联网连接恢复。 – user1296763 2012-04-09 19:30:16

+0

因此,创建一个方法只打在主线程上,就像-internetConnectionDown,并调用它来清理你的线程并在互联网再次可用时注册NSNotification。然后你可以创建你的子线程并让它们再次做它们的事情。请注意,这与在Internet连接启动之前阻止这些子线程不同。我建议你在没有找到互联网连接的情况下拆除子线程,并将它们设置为启用状态。 – 2012-04-10 18:10:48