2

私は通常のサーバー同期プロセスを実行するiPadアプリを持っています-それは約10秒ごとに実行されます。同期プロセスは、CoreDataSQLベースのストアに挿入されたレコードをダウンロードします。処理されるレコードの数が数百または数千に達する場合があります。

Asynchronous NSURLConnection現在の同期プロセスは、メインスレッドによってトリガーされたものに基づいています。呼び出しによってすべてNSDataが収集されるasyncと、メインスレッドがNSOperationバックグラウンドでを起動してを解析NSDataし、データベースに挿入します。

したがって、NSURLConnectionは非同期で実行され、db挿入はバックグラウンドで実行されますNSOperation。ただし、とのオーケストレーションはNSURLConnectionメインNSOperationスレッドで行われます。大量のデータがダウンロードされていることを考えると、メインスレッドでのこの少量のオーケストレーションでさえ、UIの応答性に影響を与える可能性があると思います。

したがって、コードを単一のバックグラウンドにリファクタリングし、を同期呼び出しにするNSOperationことを考えています。NSURLConnection次に、シングルNSOperationが同期的にダウンロードしNSData、db挿入を管理します。

かなり大規模なリファクタリングに着手する前に、これが良い決定であるかどうかについての人々の見解に興味があります。

現在のメカニズムでは、UIにときどきためらいがあります。メカニズム全体をバックグラウンドNSOperationに配置することで、UIの応答性が維持されることを期待しています。

知恵の言葉をいただければ幸いです。

ありがとう。

4

1 に答える 1

2

同期接続に切り替えることはお勧めしません。非同期接続はより少ないメモリを使用し、ダウンロードプロセスをより細かく制御できます。NSURLConnectionUIのフリーズを回避するために、次のように、デリゲートメソッド内でのみバックグラウンド処理を強制しようとします。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        [self.mutableData appendData:data];
    });
}

編集:@jrturtonがコメントで述べたように、NSURLConnectionデリゲートメソッドのキューを指定できます。setDelegateQueue:メソッド(iOS 5.0以降)を使用します。

于 2013-03-27T11:54:26.067 に答える