基本的に、ユーザーが更新ボタンをタップするたびにサーバーから画像をロードしています。ただし、この読み込みメカニズムではメイン スレッドがフリーズするため、GCD を使用して別のスレッドで画像を読み込むことにしました。チュートリアルを見て、正しく設定しているように見えますが、まだ同じ問題が発生しています。
私のコード:
-(IBAction)refreshButton:(id)sender{
dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
dispatch_async(myQueue, ^{
[[API sharedInstance] commandWithParams:[NSMutableDictionary dictionaryWithObjectsAndKeys:
@"stream",@"command",@"0",@"IdImage",_contentFilter,@"contentFilter",
nil]
onCompletion:^(NSDictionary *json){
NSMutableArray *tempArray = [json objectForKey:@"result"];
NSMutableArray *tempDataArray = [[NSMutableArray alloc] initWithCapacity:[_imagesTemporaryHolder count]];
NSLog(@"loaded temporary image holder");
for (int i=0;i<[_images count];i++) {
NSLog(@" populating _imagesData");
NSString *imageID = [[tempArray objectAtIndex:i] objectForKey:@"IdImage"];
NSString *imageURL = [NSString stringWithFormat:@"http://swiphtapp.com/Swipht/upload/%@.jpg",imageID];
NSData *tempImageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:imageURL]];
[tempDataArray insertObject:tempImageData atIndex:i];
}
}];
dispatch_async(dispatch_get_main_queue(), ^{
// Update the UI
});
});
}
API クラスに移動して、そこで何かを変更する必要があるのでしょうか? ちなみにAFNNETWORKINGを使っています。
助けてくれてありがとう!
更新 1 :
API の「onCompletion」ブロックが問題の原因のようです... NSLog(isMainThread) チェックインを実行したところ、メイン スレッドで実行されていることを意味する YES が返されましたが、私が行ったようにすべきではありませんそれを GCD にカプセル化しました。これを解決する方法について考えていますか?
すばらしい人々のおかげで答えました
@エリック
API 呼び出しの完了ブロックは、受信したデータに基づいてビューを通常更新する場所であるため、メイン スレッドで実行されることを意図しています。全体をカプセル化するのではなく、GCD のものを補完ブロックの内側に配置してみてください。元の API 呼び出しから返された URL から NSData を取得しているため、メイン スレッドで非常に時間がかかっています。
基本的に、GCD は API 呼び出しの完了ブロックにある必要がありました。
再度、感謝します!