gpt4 book ai didi

ios - Mainqueue 在 NSURLConnection 中使用时可以执行后台任务吗?

转载 作者:行者123 更新时间:2023-11-29 02:54:34 27 4
gpt4 key购买 nike

1)当我们在NSURLConnection中使用mainQueue来发送异步请求时,它是如何通过后台运行来获取响应的?因为mainqueue只是用来更新UI的。对于EX:

 [NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue   mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
if ([data length] > 0 && error == nil)
[delegate receivedData:data];
else if ([data length] == 0 && error == nil)
[delegate emptyReply];
else if (error != nil && error.code == ERROR_CODE_TIMEOUT)
[delegate timedOut];
else if (error != nil)
[delegate downloadError:error];
}];

最佳答案

当您说 mainQueue 仅用于更新 UI 严格来说是不正确的。

确切地说,mainQueue 用于更新 UI,因此开发人员避免在 mainQueue 上执行任何其他任务,以免在 UI 上引入延迟。并非完全禁止。

但是,在 mainQueue 上执行异步任务(如网络请求)确实是一个坏主意,因为它会引入无限延迟,从而完全破坏 UI 的流畅性

为了不阻塞您的 mainQueue,您应该以这种方式执行您的请求:

  • 创建自己的应用操作队列

    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
  • 然后在您需要的任何地方重用您的operationQueue 来执行您的网络请求

    [NSURLConnection sendAsynchronousRequest:urlRequest queue:operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    if ([data length] > 0 && error == nil)
    [delegate receivedData:data];
    else if ([data length] == 0 && error == nil)
    [delegate emptyReply];
    else if (error != nil && error.code == ERROR_CODE_TIMEOUT)
    [delegate timedOut];
    else if (error != nil)
    [delegate downloadError:error]; }];

另一种更安全、更有效的替代方法是使用 AFNetworking framework

关于ios - Mainqueue 在 NSURLConnection 中使用时可以执行后台任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24074865/

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