2010-08-17 28 views
0

下面是WWDC 2010届208幻灯片:在iOS主线程的runloop vs bg线程的runloop中调度异步下载?

conn = [[NSURLConnection alloc] initWithRequest:req 
    delegate:self startImmediately:NO]; 
[conn scheduleInRunLoop: [NSRunLoop currentRunLoop] 
    forMode: NSDefaultRunLoopMode]; 
[conn start]; 

是否有与安装多块康涅狄格州的在currentRunLoop相关的问题?

在后台线程的runloop中调度NSURLConnection有什么好处?

谢谢!

回答

2

您使用短语“secondary runloop”表示您不知道运行循环是什么。

NSRunLoop是一个线程的“主循环”的实现。或多或少,

while ([runLoop waitNextEvent]) { 
    NSAutoreleasePool * pool = [NSAutoreleasePool new]; 
    [runLoop handleEvent]; 
    [pool release]; pool = nil; 
} 

运行循环有一个线程。每个线程至多有一个运行循环。 “performSelectorOnMainThread”会在运行循环中安排它,但程序员通常会谈论线程,而不是运行它所使用的任何循环抽象,因为它们都是一样的。并非所有的线程都有运行循环(NSThread的函数通常会给你一个没有运行循环的线程;我认为如果你需要的话你必须自己创建运行循环)。

“currentRunLoop”是当前正在执行的线程的运行循环。这是或许是的主线程,除非你使用过NSOperation/dispatch _ */etc。如果你安排在另一个线程上,然后(我认为)委托回调从另一个线程运行。你可能不希望发生这种情况。

现在,线程。

产生大部分时间处于空闲状态的后台线程没有多大意义。 NSURLConnection的处理应该很少(首先,你不能在手机中获得这么多的带宽);在主运行循环中运行它几乎没有任何开销;线程往往会有更大的开销。

如果您正在处理数据,并且处理是CPU密集型的,那么您可能希望它在后台线程中运行。您可能会将连接放置在后台线程中,但通常在主线程中尽可能多地执行。

我不会开始处理线程间通信问题,因为它们是一个主要的难题。只有在知道需要时才使用并发性。

(而直到iPhone进入双核,你几乎肯定不需要为你写的代码的99%。)

+0

如果我要下载30 + JPEG的一排,它使感觉维护一个后台线程并追加10 x NSURLConnection的bg线程的runloop?那么后台线程是否可以直接操作模型,并且主线程使用KVO来更新视图? – Henry 2010-08-17 04:40:46

+1

UIKit不是特别的线程安全;我不知道' - [UIImage imageWithData:]'是否可以安全地从后台线程调用。据我所知,KVO通知也在导致修改的线程中运行;你需要做显式的“performSelectorInMainThread:”或者等价的做到这一点。再次,*线程是不值得的,除非你有性能问题*。 – 2010-08-17 13:36:10

+0

CurrentRunLoop类方法返回与当前线程关联的runLoop,并在必要时创建一个(当前线程不存在) – VdesmedT 2010-09-27 16:27:34