2

基本的に、ユーザーが更新ボタンをタップするたびにサーバーから画像をロードしています。ただし、この読み込みメカニズムではメイン スレッドがフリーズするため、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 呼び出しの完了ブロックにある必要がありました。

再度、感謝します!

4

1 に答える 1

0

これが、最初の投稿の下のコメントで得られた答えだと思います。

-(IBAction)refreshButton:(id)sender
{
    [[API sharedInstance] commandWithParams:[NSMutableDictionary dictionaryWithObjectsAndKeys:
                                             @"stream",@"command",@"0",@"IdImage",_contentFilter,@"contentFilter",
                                             nil]
                               onCompletion:^(NSDictionary *json){

                                   dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);

                                   dispatch_async(myQueue, ^{
                                       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

                                       });
                                   });
                               }];
}
于 2013-07-22T22:45:59.530 に答える