0

要するに、私はCoreDataの電話にローカルに保存されている一連のデータを表示することを目的としたアプリを持っています。

CoreDataからデータをプルしてから、メインUIViewに約70のサブビューを追加します。これにより、すべてのサブビューがメインビューに追加されるまで、アプリがフリーズします(応答しません)。

アプリがフリーズしないように、すべてのサブビューを非同期で追加する方法を見つけたいと思います。

使ってみましperformSelectorOnMainThreadたが、同じ時間がかかります。

私に何ができる?

ありがとう。

[編集]ビューはボタンが押されるたびに更新される必要があるため、ボタンが押されるたびにDBを検索してビューを更新します。つまり、以前に追加されたすべてのサブビューを削除し、メインビューに約70のサブビューを追加します。

これは、コードがどのように見えるかを少し示しています。

currentEventsArray = I GET THE EVENTS FROM COREDATA
for(int i = 0; i < [currentEventsArray count]; i++){
    //I DO SEVERAL OPERATIONS WITH THE DATA AND THEN FINALLY...
    [self.view addsubview:aEventView];
 }

currentEventsArrayには、50〜80のイベントを含めることができます。すべてのイベントが完了するまで待つのではなく、サブビューを個別に追加して、同時に追加しないようにすることはできますか?

4

1 に答える 1

2

バックグラウンドスレッドを使用してデータを読み取り、ビューを作成してから、メインスレッドのメインビューにビューを追加することをお勧めします。このようなもの:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),  ^{
    currentEventsArray = /*I GET THE EVENTS FROM COREDATA*/;
    NSMutableArray *newViews = [[NSMutableArray alloc] init];
    for(int i = 0; i < [currentEventsArray count]; i++){
        //I DO SEVERAL OPERATIONS WITH THE DATA AND THEN FINALLY...
        [newViews addObject: aEventView];
    }
    dispatch_async( dispatch_get_main_queue(), ^{
        // add or replace your subviews to the main view.
    }
});

そして、データを更新する必要があるときにそれを行います。一度に複数回発生することはおそらく望ましくないことを覚えておいてください。これを行うには、コントローラーにフラグを設定して、最初のdispatch_asyncが既に実行されている場合は実行しないようにします。または、グローバルバックグラウンドキューの代わりにプライベートディスパッチキューを使用して、別の試行をキューに入れます。

独自のバックグラウンドキューを使用する場合は、呼び出し元のクラス(コントローラー)にインスタンス変数を作成し、それをロードするときに新しいキューを作成する必要があります。

_updateQueue = dispatch_queue_create( "UpdateQueue", DISPATCH_QUEUE_SERIAL);

の代わりにそれを使用してください:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)

その上。

于 2013-03-26T15:20:11.517 に答える