Ios GCD块中的runLoop在没有源代码的情况下如何工作
我试图理解iOS中的多线程编程Ios GCD块中的runLoop在没有源代码的情况下如何工作,ios,objective-c,multithreading,grand-central-dispatch,nsrunloop,Ios,Objective C,Multithreading,Grand Central Dispatch,Nsrunloop,我试图理解iOS中的多线程编程 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) , ^{ NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
, ^{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (connection == nil) {
NSLog(@"Request failed");
} else {
NSLog(@"Request sent");
}
[[NSRunLoop currentRunLoop] run];//How does this work?
});
这段代码运行良好,我得到了预期的回调
在文件中
有人提到,“运行”方法“将接收器放入一个永久循环,在此期间,它处理来自所有连接输入源的数据。”
现在,在上面的代码中,我没有将任何源代码附加到runLoop。它是如何工作的?每一个正常工作的
NSThread
都需要连接到runloop。调用dispatch\u async()
GCD时,使用runloop创建线程,该线程将与[nsrunlop curentRunLoop]
一起使用。当您使用NSURLConnection
创建一些工作时,据我所知,创建的连接作为源附加到当前runloop。因此,如果您不希望runloop处于活动状态而无法入睡,则需要执行[[nsrunlop curentrunlop]run]
。在这种情况下,当连接接收到消息时,runloop将获取该消息
希望这有帮助
更新:
通过苹果文档:
性能选择器可以是输入源
Cocoa定义了一个自定义输入源,允许您执行
任何线程上的选择器
这就是为什么需要保持runloop活动状态:
在另一个线程上执行选择器时,目标线程必须
有一个活动的运行循环
为什么需要执行[[NSRunLoop currentRunLoop]run]?以获取NSURLConnectionLegate回调。如果没有此功能,将不会调用回调。谢谢。在进一步寻找答案时,我发现每个线程都是用运行循环创建的,根据文档,在NSURLConnection中,它在当前运行循环上调度连接。@optimus我不明白。我不认为这回答了你的问题。输入源是什么?根据NSURLConnection.h中的文档,“使用+connectionWithRequest:delegate:或-initWithRequest:delegate:方法创建的NSURLConnections会立即安排在当前运行循环上,并且无需发送-start消息来开始资源加载。”. 这意味着,NSURLConnection正在将输入源附加到runloop。它到底是如何实现的(performSelector、自定义输入源或其他)是我在回答中没有想到的一些实现细节。