0

私の見解では、天気関連の情報を表示しようとしています。私が使う

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    Make NSURL and other related things
    Send NSURLRequest
    Set 2 UILabels to data
    NSLog(Show data retrieved)
});

何らかの理由で、uilabel が新しいテキストに変わる約 15 ~ 45 秒前に NSLog 行が表示されます。私は Obj-C にかなり慣れていないため、コードの多くはチュートリアルを使用して作成されているため、dispatch_async メソッドについて十分に理解していません。ご意見やご提案をいただければ幸いです。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURLResponse *response = nil;
        NSError *error = nil;
        NSData *respData = nil;
        NSURLRequest *forecastRequest = [NSURLRequest requestWithURL:currentForecastUrl];
        respData = [NSURLConnection sendSynchronousRequest:forecastRequest returningResponse:&response error:&error];
        [_responseData appendData:respData];
        NSLog(@"Response: %@", response);
        NSLog(@"Error: %@", error);
        id JSON = [_responseData yajl_JSON];
        currentForecast = [[NSArray alloc]initWithObjects:[JSON objectForKey:@"temperature"],[JSON objectForKey:@"feelsLike"],nil];

        [_temperatureLabel setText:[NSString stringWithFormat:@"%@",[JSON objectForKey:@"temperature"]]];
        [_tempDescriptionLabel setText:[NSString stringWithFormat:@"%@",[JSON objectForKey:@"desc"]]];
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:2.0];
        [_tempDescriptionLabel setAlpha:1];
        [_temperatureLabel setAlpha:1];
        [UIView commitAnimations];
        NSLog(@"Done");

        NSLog(@"JSON: %@", [JSON yajl_JSONStringWithOptions:YAJLGenOptionsBeautify indentString:@"  "]);
    });
4

4 に答える 4

2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

バックグラウンド スレッドの作成に使用されますが、ユーザー インターフェイスはメイン スレッドで更新する必要があります

このような:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     //do stuff in background

     dispatch_async(dispatch_get_main_queue(), ^{

         // Update your UI
     });

});
于 2014-01-31T15:27:35.100 に答える
0

あなたの問題はUILabel、メインスレッドから s を更新しようとしているためです。メイン スレッドから UI 要素を更新してもまだ更新されますが、長い遅延が発生するという正確な症状を以前に見たことがあります。したがって、このように動作する UI 要素がある場合は常に、それがメイン スレッドで実行されていることを確認してください。

于 2014-01-31T15:25:51.873 に答える