1

Rails バックエンドで起動するたびにサーバーとデータを同期するアプリがあります。API は完全に機能しますが、インターフェイスを更新する必要があるときにインターフェイスが応答しなくなるという問題があります。

現在、同期を開始するために GCD を使用しています。

Sync *sync = [[Sync alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [sync force_sync:@""];
    [appModel updateSyncTime:current_time];
});

同期が完了したら、Sync オブジェクトから NSNotification をアプリに送信して、インターフェイスを更新します。

dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Sync-Completed" object:self];
});

通知を受信すると、他のクラスは次のように UITableView にデータをリロードするだけです。

 - (void)notificationReceived:(NSNotification *)notification {
    [dataTable reloadData];
 }

通知が受信されるまで、UI は完全にレスポンシブです。通知を受信すると、更新が完了するまで UITableViews を他の UI 要素間でスクロールできません。これを行うためのより良い方法があると確信していますが、どのように?

前もって感謝します!

4

1 に答える 1

1
dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Sync-Completed" object:self];
});

非同期ではありません - メイン キューに大量の更新作業 (同期完了通知の処理) をダンプしただけなので、UI を更新するコードに対処しない限り、アプリはロックアップします。

また、大量の IO 操作にグローバル キューを使用することは、必ずしも良い考えではありません。それを行うだけでUIがロックされるケースを見てきました。そのため、同期自体ではなく、通知であることを確認してください。

同期そのものであることがわかった場合は、独自の NSOperation キューを作成し、そのブロックから NSOperation を作成します。

走行距離は異なる場合がありますが、一般的に、グローバル キューを使用しても、非同期 IO ではうまくいきませんでした。

于 2012-09-17T14:53:55.283 に答える