Ios 需要一些关于调度队列、线程和nsrunlop的说明吗
以下是我所知道和理解的: 全局队列是一个并发队列,它可以将任务分派给多个线程。无法保证任务的执行顺序。e、 g:Ios 需要一些关于调度队列、线程和nsrunlop的说明吗,ios,multithreading,grand-central-dispatch,nsthread,nsrunloop,Ios,Multithreading,Grand Central Dispatch,Nsthread,Nsrunloop,以下是我所知道和理解的: 全局队列是一个并发队列,它可以将任务分派给多个线程。无法保证任务的执行顺序。e、 g: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), { for (int i; i<10; i++) { doTask() } }) 每次只有一个任务被分派到一个线程&get execute。命令是FIFO ====我感到困惑和不完全理解的内容======== 主线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), {
for (int i; i<10; i++) {
doTask()
}
})
每次只有一个任务被分派到一个线程&get execute。命令是FIFO
====我感到困惑和不完全理解的内容========
dispatch\u async()
和dispatch\u sync()
函数是否知道将任务分派到哪个线程,或者队列是否知道将任务分派到哪个线程
nsrunlop
。对于这些后台线程,通常也不需要运行循环。我们过去必须为后台线程创建自己的nsrunlop
(例如,在后台线程上调度NSURLConnection
时),但现在不再经常需要这种模式
对于历史上需要运行循环的事物,如果在后台线程上运行它们,通常会有更好的机制。例如,您现在使用的不是NSURLConnection
,而是nsursession
。或者,您可以创建GCD计时器调度源,而不是后台线程上的nsrunlop
上的NSTimer
nsrunlop
(无论如何,通常不应该这样做),可以自己创建并跟踪它。而且,当使用运行循环调度线程时,我倾向于自己创建NSThread
并在该线程上调度运行循环,而不是占用GCD的一个工作线程-[NSRunLoop run]
或CFRunLoopRun
或类似命令)。大多数线程,包括为GCD队列创建的线程,从来没有运行循环+[NSRunLoop mainlunloop]
或CFRunLoopGetMain
)或当前线程的运行循环(使用+[NSRunLoop currentlunloop]
或CFRunLoopGetCurrent
)。如果需要某个任意线程的运行循环,则必须找到一种方法,在该线程上调用CFRunLoopGetCurrent
,并以安全、同步的方式跨线程传递其返回值
请注意,nsrunlop
接口不是线程安全的,但是CFRunLoop
接口是线程安全的,因此如果需要访问另一个线程的运行循环,应该使用CFRunLoop
接口
还请注意,您可能不应该在GCD队列上运行的块内长时间运行run循环,因为您正在占用GCD希望控制的线程。如果您需要长时间运行一个运行循环,您应该为它启动自己的线程。您可以在中看到这方面的示例。注意它如何使专用线程的运行循环在名为sLegacyRL
的静态变量中可用,该变量在dispatch\u信号量\u t
的保护下初始化为什么希望/需要在后台线程上运行循环?如果你描述一下你想做什么,我们也许可以
dispatch_async(dispatch_queue_create("my.serial.queue", nil) {
...
}