代码之家  ›  专栏  ›  技术社区  ›  Leestar

AF网络设置运行循环模式?

  •  0
  • Leestar  · 技术社区  · 13 年前

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

     operation.runLoopModes = [NSSet setWithObject:NSDefaultRunLoopMode];
    

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

    2 回复  |  直到 13 年前
        1
  •  1
  •   Roman B.    13 年前

    所以我们开始,替代解决方案,没有硬编码注入。假设您使用的是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的 solution ,这依赖于相同的技术。

        2
  •  0
  •   Community Mohan Dere    8 年前

    最近,当我在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为什么要创建它的独立网络线程。在后台处理传入数据?如果有人有猜测,请回答。

    另请参阅 this 问题