异步NSURLConnection,并发NSOperation,什么时候使用NSRunLoop?

cin*_*cin 4 concurrency nsurlconnection nsoperation nsrunloop ios4

我正在尝试在辅助线程中运行NSURLConnection async(目标是iOS4),为此我创建了一个并发的NSOperation,我想我差不多了,但我不清楚以下内容:

1)在iOS4中NSOperationQueue addOperation在新线程中启动操作,因为使用GCD,基于技术问答QA1712,但是,我的测试(模拟器和iPad)显示始终在主线程上调用start(),任何想法,我需要在这里检查:如果在主线程上然后产生一个新的?

2)如果通过addOperation()在辅助线程上实际调用了start,那么我可以通过在当前NSRunLoop上进行调度来启动我的异步NSURLConnection:

[self.connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.connection start];
Run Code Online (Sandbox Code Playgroud)

这里的LinkedImageFetcher示例,我不需要循环,直到完成:

do {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (!isCompelted);
Run Code Online (Sandbox Code Playgroud)

3)假设我在主线程上调用自定义NSOperation start()并且2)是正确的,并且我在start()中生成一个新线程来调用我的自定义main()方法:

[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];
Run Code Online (Sandbox Code Playgroud)

在我的main()中,我需要运行当前的线程运行循环:

do {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (!isCompelted);
Run Code Online (Sandbox Code Playgroud)

这是我在并发NSOperation中设法运行NSURLConnection的唯一实例,但我不确定我是否需要运行RunLoop,如果该线程由GCD提供为技术说明状态,我可以遵循逻辑2)或者我还需要运行线程的runloop吗?如何测试GCD提供的线程?

非常感谢任何解释

cin*_*cin 9

好吧,我最终解决了这个问题,所以人们可能会对细节感兴趣:

1)在主线程上调用了start(),因为我使用的是[NSOperationQueue mainQueue]而不是用[[NSOperationQueue allc] init]创建一个新队列.但是在NSOperation start()中检查当前线程是否是mainThread,然后直接从那里调用main()或者生成一个新线程(如果我们在mainThread上)并没有受到伤害.

2)我意识到LinkedImageFetcher对于理解运行循环和线程来说太复杂了,而且不必要,因为主题并不复杂.start()方法中所需要的只是保持辅助线程运行循环,直到我们完成(isCompleted),NSURLConnection的所有运行循环都在监听来自连接的输入并触发回调(didreceivereponse, didreceivedata等.

3)是运行run循环是必要的,以获得相同(在这种情况下是辅助)线程的连接回调.

有关更多信息,请参阅线程编程指南中的运行循环.