gpt4 book ai didi

ios - GCD block 中的runLoop如何在没有源码的情况下工作

转载 作者:搜寻专家 更新时间:2023-10-30 20:17:28 25 4
gpt4 key购买 nike

我试图了解 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

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

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

最佳答案

为了正常工作,每个 NSThread 都需要附加到 runloop。当您调用 dispatch_async() 时,GCD 创建带有 runloop 的线程,您将使用 [NSRunLoop curentRunLoop]。当您使用 NSURLConnection 创建一些工作时,据我所知,创建的连接作为源附加到当前运行循环。所以如果你不想那个runloop会活着而不是睡着,你需要执行[[NSRunLoop curentRunLoop] run]。在这种情况下,runloop 将在连接接收到消息时获取消息。

希望这对您有所帮助。

更新:

通过 Apple 文档:

performSelector 可以是输入源

Cocoa defines a custom input source that allows you to perform a selector on any thread.

这就是为什么您需要执行 keep runloop alive 的原因:

When performing a selector on another thread, the target thread must have an active run loop

关于ios - GCD block 中的runLoop如何在没有源码的情况下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24779306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com