16

dismissViewControllerAnimated:completion:却下間の遅延を除いて、私のアプリケーションでは正常に機能しています。

[api loginWithUsername:[dict objectForKey:@"username"] andPassword:[dict objectForKey:@"password"] andSuccessBlock:^(id json) {
    NSLog(@"DONE... %@", [json objectForKey:@"status"]);
    NSString *status = [json objectForKey:@"status"];
    if([status isEqualToString:@"ok"]){
        app.user = [json objectForKey:@"data"];
        [self dismissViewControllerAnimated:YES completion:nil];
    }else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"could not log you in" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    }
}];

私のコンソールでは、エコーされた「DONE ... ok」が表示されます。これは、コールバックブロックが実行されたことを意味しますが、約3〜4秒後にモーダルビューが最終的に閉じられます。

この遅延の原因は何ですか?

4

3 に答える 3

35

UI コードがメイン スレッドで実行されていることが保証されていない場合は、他のスレッドで実行される可能性があり、その場合、数秒の遅延が発生します。

これを追加して、却下がメインスレッドで実行されるようにすることができます。

dispatch_async(dispatch_get_main_queue(), ^{
    [self dismissViewControllerAnimated:YES completion:nil];
});

一般に、ほとんどのコードはすでにメイン スレッドで実行されているため、これは問題ではありません。ほとんどの場合、viewDidLoad などの UIKit メソッドから実行されるコードを追加するためです。これらのメソッドは、メイン スレッドで実行されることが保証されています。

別のスレッドでコードを実行すると、問題が発生します。これが発生する可能性のあるケースの 1 つは、たとえば、ネットワーク ライブラリの完了ブロック呼び出しで、要求がバックグラウンドで行われる場合です。

于 2013-01-15T18:37:14.503 に答える
3

viewWillAppearParentViewController の ' 'と currentViewcontroller の' ' を確認viewWillDisappearしてください。この 2 つの関数に重い計算やメモリ割り当てが含まれていないことを確認してください。

于 2013-01-15T16:04:56.120 に答える
0

変更してみる

NSString *status = [json objectForKey:@"status"];
NSLog(@"DONE... %@", status);

そして試してみてください

if([ステータス isEqualToString:@"ok"]){

    [self dismissViewControllerAnimated:YES completion:nil];
    app.user = [json objectForKey:@"data"];
}else{

JSONオブジェクトの大きさがわからないので、応答するのに少し時間がかかる可能性があり、ログステートメントの後に再度呼び出して、却下する前に何か他のことをしている可能性があります。

于 2013-01-15T16:32:06.243 に答える