【问题标题】:How does runLoop in GCD block work without sourceGCD块中的runLoop如何在没有源代码的情况下工作
【发布时间】:2014-07-16 11:13:21
【问题描述】:

我试图了解 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?
                   });

这段代码运行良好,我得到了预期的回调。

在文档https://developer.apple.com/library/ios/documentation/cocoa/Reference/Foundation/Classes/NSRunLoop_Class/Reference/Reference.html#//apple_ref/occ/instm/NSRunLoop/run

提到'run'方法,'将接收器置于一个永久循环中,在此期间它处理来自所有附加输入源的数据。'

现在,在上面的代码中,我没有将任何源附加到 runLoop。它是如何工作的?

【问题讨论】:

  • 为什么需要执行[[NSRunLoop currentRunLoop] run]?
  • 获取 NSURLConnectionDelegate 回调。没有这个,回调将不会被调用。

标签: ios objective-c multithreading grand-central-dispatch nsrunloop


【解决方案1】:

每个NSThread 都需要附加到运行循环才能正常工作。当你调用dispatch_async()时,GCD 使用你将与[NSRunLoop curentRunLoop] 一起使用的runloop 创建线程。据我了解,当您使用NSURLConnection 创建一些工作时,创建的连接将作为源附加到当前运行循环。因此,如果您不想让 runloop 处于活动状态并且不会入睡,则需要执行 [[NSRunLoop curentRunLoop] run]。在这种情况下,runloop 会在连接收到消息时得到消息。

希望这会有所帮助。

更新:

Apple 文档:

performSelector 可以是输入源

Cocoa 定义了一个自定义输入源,允许您执行 任何线程上的选择器。

这就是为什么你需要让 runloop 保持活跃:

在另一个线程上执行选择器时,目标线程必须 有一个活跃的运行循环

【讨论】:

  • 谢谢。在进一步寻找答案时,我发现每个线程都是使用运行循环创建的,并且根据文档,在 NSURLConnection 中,它会在当前运行循环上安排连接。
  • @optimus 我不明白。我不认为这回答了你的问题。输入源是什么?
  • 根据 NSURLConnection.h 中的文档,“使用 +connectionWithRequest:delegate: 或 -initWithRequest:delegate: 方法创建的 NSURLConnections 会立即在当前 runloop 上调度,并且没有必要发送-start 消息开始加载资源。

    "。这意味着, NSURLConnection 将输入源附加到运行循环。它是如何做到的(performSelector、自定义输入源或其他)是我在答案中没有预料到的一些实现细节。

猜你喜欢
  • 2018-01-09
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多