gpt4 book ai didi

objective-c - GCD 和异步 NSURLConnection

转载 作者:IT王子 更新时间:2023-10-29 07:57:11 24 4
gpt4 key购买 nike

我知道如果我创建一个 NSURLConnection(标准异步连接),它将在同一个线程上回调。目前这是在我的主线程上。 (工作也很好)。

但我现在使用相同的代码做其他事情,我需要保持我的 UI 活泼....

如果我这样做

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

/* and inside here, at some NSURLConnection is created */


});

.. 是否有可能我的 NSURLConnection 已创建但我的线程在 url 连接返回之前就消失了?

我是 GCD 的新手。在我的 url 连接返回之前,如何让线程保持事件状态,或者是否有更好的方法可以做到这一点?

最佳答案

因此,真正的问题不在于您的 block 在其上运行的线程的生命周期,而是该特定线程不会配置运行循环以接收从连接返回的任何事件的事实。

那怎么解决呢?有不同的选择可供考虑。我可以列出一些,我相信其他人会列出更多。

1 - 您可以在此处使用同步连接。一个缺点是您不会获得身份验证、重定向、缓存等的回调。(同步连接的所有常见缺点。)另外,每个连接当然会在一段时间内阻塞一个线程,所以如果您正在做如果其中有很多,那么您可能会同时阻塞几个线程,这很昂贵。

2 - 如果您的连接很简单并且您使用的是 iOS5,那么您可以使用此方法:

+ (void)sendAsynchronousRequest:(NSURLRequest *)request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))

这将启动一个异步连接,然后允许您指定一个完成处理程序(用于成功或失败)您希望在其上安排该 block 的 NSOperationQueue。

同样,您的缺点是无法获得身份验证、缓存等可能需要的回调。但至少您不会让正在运行的连接阻塞线程。

3 - iOS5 的另一个选项是为所有委托(delegate)回调设置队列:

- (void)setDelegateQueue:(NSOperationQueue*) 队列 NS_AVAILABLE(10_7, 5_0);

如果你使用它,那么所有的委托(delegate)方法都将在你指定的任何 NSOperationQueue 的上下文中执行。所以这类似于选项 #2,期望您现在获得所有委托(delegate)方法来处理身份验证、重定向等。

4 - 您可以设置您自己的线程,您可以专门控制这些线程来管理这些连接。在设置该线程时,您适本地配置了一个运行循环。这在 iOS4 和 5 中会很好地工作,并且显然会为您提供您想要处理的所有委托(delegate)回调

5 - 您可能会考虑异步连接处理的哪些部分真正干扰了您的用户界面。通常启动连接或接收委托(delegate)回调并不昂贵。昂贵的(或不确定的)成本通常是在处理您最后收集的数据时产生的。这里要问的问题是,您是否真的通过在某个队列上安排一个 block 来启动异步连接来节省时间,该连接将立即关闭并在另一个线程上执行它的操作?

因此您可以从主线程启动连接,并在主线程上接收所有委托(delegate)回调,然后在这些委托(delegate)方法的实现中触发您需要的任何昂贵的工作在其他队列或线程上执行。

所以像这样:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {      
// go ahead and receive this message on the main thread
// but then turn around and fire off a block to do the real expensive work

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// Parse the data we've been collecting

});

}

同样,这并不全面。有很多方法可以处理这个问题,具体取决于您在此处的具体需求。但我希望这些想法有所帮助。

关于objective-c - GCD 和异步 NSURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8918501/

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