Ios GCD块中的runLoop在没有源代码的情况下如何工作

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"]];

我试图理解iOS中的多线程编程

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、自定义输入源或其他)是我在回答中没有想到的一些实现细节。