1

私はdb同期メカニズムを備えたアプリに取り組んでいます。

私は次のように同期サービスを呼び出していました

[NSThread detachNewThreadSelector:@selector(sync) 
                         toTarget:[SyncService sharedInstance] 
                       withObject:nil];

ただし、ここでの問題は、同期がバックグラウンドで実行されないことです。結果としてアプリケーション

同期が完了するまでアイドル状態になります。そこで、背景にGCDを使うことを考えました

処理し、次のことを行いました

dispatch_async(dispatch_get_global_queue(0, 0), ^{

    [[SyncService sharedInstance]Sync]; 

});

しかし、今でも同期はバックグラウンドで実行されていません。同期をで実行したい

バックグラウンド。

編集:

[NSThread detachNewThreadSelector:@selector(sync)を使用しないときはいつでも

                                toTarget:[SyncService sharedInstance] withObject:nil];, 

すぐ次の行[[[SyncServicesharedInstance]デリゲート]addObject:self]; ではありません

と呼ばれる。GCD(グローバルキュー)を使用している場合、これは呼び出されません。

どんな助けでも大歓迎です。

4

2 に答える 2

1

dispatch_get_global_queue間違ったプロパティでメソッドを呼び出しています。最初の 0 はDISPATCH_QUEUE_PRIORITY_DEFAULT、定義済みの優先順位のいずれかを意味します: DISPATCH_QUEUE_PRIORITY_HIGHDISPATCH_QUEUE_PRIORITY_DEFAULTDISPATCH_QUEUE_PRIORITY_LOWまたはDISPATCH_QUEUE_PRIORITY_BACKGROUND。.

次のように呼び出す必要があります。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [[SyncService sharedInstance]Sync]; 
});

また、ドキュメントには、呼び出す+detachNewThreadSelector:toTarget:withObject:と新しいスレッドが開始されると記載されています。UI を妨げているものは他にありませんか。そしてsync、メインスレッドと呼ぶメソッドで何をしますか? これは、メイン スレッド/キューが再びブロックされることを意味する可能性があります。

于 2012-11-15T14:19:40.373 に答える
0

これを試しましたか:

[[SyncService sharedInstance] performSelectorInBackground:@selector(Sync) withObject:nil]

rckoenes が言うように、Sync メソッドのメインスレッドで何も行われていないことを確認する必要があります

于 2012-11-15T14:35:14.400 に答える