0

AFNetworking のデフォルトの runLoopModes は NSRunLoopCommonModes です。NSDefaultRunLoopMode を使用して設定します

 operation.runLoopModes = [NSSet setWithObject:NSDefaultRunLoopMode];

しかし、うまくいきません。scrollViewをスクロールすると、ダウンロードタスクがまだ実行されています。誰でも私を助けることができますか?ありがとう。

4

2 に答える 2

1

それでは、ハードコーディングされたインジェクションを使用しない代替ソリューションを紹介します。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 のソリューションも確認してください。

于 2012-09-03T12:38:04.463 に答える
0

最近、UITableViewで画像の遅延読み込みを実装しているときに、同様の質問に遭遇しました。ここでは、ユーザーのスクロールを優先する必要があります。

あなたの方向は正しいです。問題はランループモードにあります。UIImageView+AFNetworking 拡張機能を使用すると、画像は別のネットワーク スレッドで動作する AFURLConnectionOperation で読み込まれるため (実装を参照)、NSURLConnections はメイン スレッドでは実行されません。

UITrackingRunLoopMode がアクティブなときにタスクを停止するには、ネットワーク コードを何らかの方法でメイン スレッドに移動する必要があります。

可能な解決策:

  1. リクエスト操作のデフォルトの実行ループ モードを設定します。

    AFImageRequestOperation *requestOperation = [[AFImageRequestOperation alloc] initWithRequest:urlRequest];
    [requestOperation setRunLoopModes:[NSSet setWithObject:NSDefaultRunLoopMode]];
    
  2. 接続をメイン スレッドに配置します (これで問題ありません。NSURLConnections は独自のスレッドを実行しています): 検索+ (NSThread *)networkRequestThreadして return にし[NSThread mainThread]ます。これは他の状況には適していない可能性があります。ロックに注意してください。

AFNetworking が別のネットワーク スレッドを作成する理由はまだわかりません。着信データをバックグラウンドで処理するには? 推測できる人は回答お願いします。

この質問も参照してください。

于 2012-09-02T20:55:58.287 に答える