0

HTTP 経由で作成/更新されるコア データ オブジェクトがあります。また、バックグラウンド スレッドを作成して、アプリからタイムスタンプと状態情報を継続的に受け取り、コア データ オブジェクトを更新したいと考えています。これには NSOperation または GCD を使用する必要がありますか? 単なる単純なタスクではないため、NSOperation 内でループできるため、より優れているように見えますが、実行中にメインスレッドから操作に情報を渡す方法がわかりません。これを行う簡単な方法はありますか?操作からメイン スレッドにメッセージを送信することに関する多くのスレッド/記事を見てきましたが、それにメッセージを渡すことについては何もありません。

NSOperation/GCD を使用することは良い解決策のように思えますか?

4

2 に答える 2

0

私はこれをすべて間違って見ていました(本質的にNSThreadをサブクラス化し、それとの間でデータを渡したいと思っていました)。ブロックの適切な使用については考えていませんでした。

基本的に、私がやっていることは次のとおりです。

loadStuff:(NSDictionary *)stuff {
    // stuff is data from HTTP GET request
    NSManagedObjectContext *context = // init context with NSPrivateQueueConcurrencyType
    context.parentContext = // main context
    [context performBlock:^{
        // insert/update entities
        // save context
    }];
}

ただし、エンティティを更新するには、バックグラウンド スレッドでループする必要があります。

//inside some method
dispatch_async(global_queue, ^{
    // _currentTimestamp is updated by a delegate
    NSInterval timestamp = _currentTimestamp;
    while (run) {
        if (timestamp != _currentTimestamp) {
            // do calculation
            // update entities if needed
            // save context
        }
    }
});
于 2013-08-29T02:13:05.073 に答える
0

一歩下がって、アーキテクチャを再検討してください。プライベート ディスパッチ キューを使用する管理オブジェクト コンテキストを使用する必要があります (オプション NSPrivateQueueConcurrencyType)。

次に、NSURLConnections を使用して必要なデータを取得します。デリゲート メソッドでデータを取得したら、 を使用してリポジトリを非同期に更新できますperformBlock

performBlockAndWait逆に、 を使用してデータを取得したり、ブロック変数または変更可能な定義済みオブジェクトを使用して、ブロックから結果を取得したい場合があります。

于 2013-08-28T13:19:58.070 に答える