AFNetworking のデフォルトの runLoopModes は NSRunLoopCommonModes です。NSDefaultRunLoopMode を使用して設定します
operation.runLoopModes = [NSSet setWithObject:NSDefaultRunLoopMode];
しかし、うまくいきません。scrollViewをスクロールすると、ダウンロードタスクがまだ実行されています。誰でも私を助けることができますか?ありがとう。
AFNetworking のデフォルトの runLoopModes は NSRunLoopCommonModes です。NSDefaultRunLoopMode を使用して設定します
operation.runLoopModes = [NSSet setWithObject:NSDefaultRunLoopMode];
しかし、うまくいきません。scrollViewをスクロールすると、ダウンロードタスクがまだ実行されています。誰でも私を助けることができますか?ありがとう。
それでは、ハードコーディングされたインジェクションを使用しない代替ソリューションを紹介します。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 で読み込まれるため (実装を参照)、NSURLConnections はメイン スレッドでは実行されません。
UITrackingRunLoopMode がアクティブなときにタスクを停止するには、ネットワーク コードを何らかの方法でメイン スレッドに移動する必要があります。
可能な解決策:
リクエスト操作のデフォルトの実行ループ モードを設定します。
AFImageRequestOperation *requestOperation = [[AFImageRequestOperation alloc] initWithRequest:urlRequest];
[requestOperation setRunLoopModes:[NSSet setWithObject:NSDefaultRunLoopMode]];
接続をメイン スレッドに配置します (これで問題ありません。NSURLConnections は独自のスレッドを実行しています): 検索+ (NSThread *)networkRequestThread
して return にし[NSThread mainThread]
ます。これは他の状況には適していない可能性があります。ロックに注意してください。
AFNetworking が別のネットワーク スレッドを作成する理由はまだわかりません。着信データをバックグラウンドで処理するには? 推測できる人は回答お願いします。
この質問も参照してください。