AF网络设置runLoopModes



AFNetworking默认的runLoopModes是NSRunLoopCommonModes。我想使用NSDefaultRunLoopMode,并将其设置为

 operation.runLoopModes = [NSSet setWithObject:NSDefaultRunLoopMode];

但它不起作用。当我滚动滚动查看时,下载任务仍在运行。有人能帮我吗?谢谢

所以我们开始了,替代解决方案,没有硬编码注入。假设您使用的是UIImageView+AFNetworking扩展:

// user began scrolling
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [[UIImageView af_sharedImageRequestOperationQueue] setSuspended:YES];
}
// user released finger and scrolling animation is finished
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    [[UIImageView af_sharedImageRequestOperationQueue] setSuspended:NO];
}

还可以看看Foursquare的解决方案,它依赖于相同的技术。

最近我在UITableView中实现图像延迟加载时遇到了类似的问题。用户滚动在这里应该有更高的优先级。

你的方向是正确的,问题出在运行循环模式下。使用UIImageView+AFNetworking扩展,图像加载有AFURLConnectionOperation,该操作在一个单独的网络线程上运行(请参阅实现),因此NSURLConnection不在主线程上运行。

要使任务在UITrackingRunLoopMode处于活动状态时停止,您需要以某种方式移动主线程上的网络代码

可能的解决方案:

  1. 为您的请求操作设置默认运行循环模式。

    AFImageRequestOperation *requestOperation = [[AFImageRequestOperation alloc] initWithRequest:urlRequest];
    [requestOperation setRunLoopModes:[NSSet setWithObject:NSDefaultRunLoopMode]];
    
  2. 将连接放到主线程上(没关系,NSURLConnection正在运行它们自己的线程):查找+ (NSThread *)networkRequestThread并使其返回[NSThread mainThread]。这可能不适合其他情况,小心锁。

我仍然不确定AFNetworking为什么要创建它的独立网络线程。在后台处理传入数据?如果有人有猜测,请回答。

另请参阅此问题。

最新更新