0

ところで: これは主に iOS 6+ に関するものです:

アプリ内のさまざまな場所から、安全にバックグラウンド化でき、スレッドセーフな機能を実行するアプリがあります。この関数の実行中にシステムを停止したくないので、次のように呼び出す代わりに、[self functionName];現在、短い間隔で NSTimer を起動しています。

 [NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(doThis:) userInfo:@"someString" repeats:NO];

私の質問は次のとおりです。単にタイマーのアイデアが嫌いなので、これについて NSNotification の調査を開始しました...それらはキューに入れられているようで、(私の意見では)どの順序でそれらを実行するかをシステムに決定させません。それら...または-実際に-すべて同時に。あなたは、決して知らない。したがって、NSNotification は次のようになります。

[[NSNotificationCenter defaultCenter] postNotificationOnMainThreadName:@"doThis" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"a",@"varA",@"b",@"varB",nil]];

では、システムにとってどちらが優れているのでしょうか...リソースに関して、そして実際には、全体的に? NSTimer または NSNotification?

明らかに、NSNotification の優れた点は、appDelegate で一度定義すると、アプリのあらゆる側面から呼び出すことができることです。NSTimerはそれを行うことができますが、必要な「ターゲット」が必要になります...ターゲットを検索するための追加の行など.

提案?

4

2 に答える 2

2

タイマーも通知もこれには適していません。バックグラウンドでメソッドを実行するだけです。いくつかのオプションがあります:

[self performSelectorInBackground:@selector(doThis:) withObject:@"someString"];

バックグラウンド スレッドは、自動解放プールで適切に設定する必要があります。ARCを使用していると仮定すると、doThis:メソッドが次のようになることを確認してこれを行います。

- (void)doThis:(NSString *)someParam {
    @autoreleasepool {
        // rest of the code here
    }
}

いっそのこと、使用する代わりに GCD (Grand Central Dispatch) を使用しperformSelectorInBackground:withObject:ます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self doThis:@"someString:];
});

これdoThis:は、ユーザー インターフェイスを更新するようなことをしなければ問題なく動作します。doThis:ある時点でユーザー インターフェイスを更新する必要がある場合は、メイン スレッドでインターフェイス コードを実行する必要があります。そのコードは次のようにラップする必要があります。

dispatch_async(dispatch_get_main_queue(), ^{
    // perform UI update here
});
于 2013-05-10T17:10:05.910 に答える