0

皆さん、

以下のシナリオについてご意見をお聞かせください。私のアプリのほとんどの画面はテーブルビューであり、テーブルビューの行数と内容は、最初にローカルコアデータテーブルからデータを読み取り、次にいくつかの複雑な計算を実行することによって決定されます。これは、ユーザーが1つの画面から別の画面に移行しているときにアプリがフリーズしないようにしたいと思います。これが私がそれをした方法です。ビューに表示された関数では、アクティビティインジケーターのアニメーション化を開始し、スレッドを生成してコアデータテーブルからデータを読み取り、関連するすべての計算を実行します。このスレッド内で、計算が完了すると、アクティビティインジケーターのアニメーション化を停止し、初期化が完了したことを示すフラグをマークしてから、テーブルビューを再読み込みします。初期化が完了する前にテーブルビューセルをロードすると、空のセルが返されます。(テーブルビューのデータソース関数は、viewWillAppearの直後でViewdidAppear()の前に呼び出されることに気付きました)。以下に私のコードを貼り付けました:

-(void)viewWillAppear:(BOOL)animated {

   [super viewWillAppear:animated];
   NSLog(@"%s",__FUNCTION__);

}

-(void)viewDidAppear:(BOOL)animated {

   [super viewDidAppear:animated];
   NSLog(@"%s",__FUNCTION__);

   [activityOutlet startAnimating];

   dispatch_async(myQueue, ^{ [self getFromCoreData];

   });


}   

- (void) getFromCoreData {

   // Get from coredata and start calculations here


   [activityOutlet stopAnimating];
   activityOutlet.hidden = YES;

   [tableOutlet reloadData];

}

上記を行うためのより良い方法があるかどうか知りたいのですが。

よろしくお願いします!

4

1 に答える 1

1

UIの更新は、メインスレッドで実行する必要があります。

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self getFromCoreData];

        dispatch_async(dispatch_get_main_queue(), ^{
            activityOutlet stopAnimating];
            activityOutlet.hidden = YES;
            [tableOutlet reloadData];
        });
    });
}

- (void) getFromCoreData {
   // Get from coredata and start calculations here
}
于 2012-07-08T14:22:35.900 に答える