1

クラスメソッドをNSNotificationCenter使用してカテゴリを作成しています:

+(void)postNotificationName:(NSString*)name onMainThread:(BOOL)mainThread withObject:(id)object;

これにより、多くの隠れた問題が発生したため、通知が配信されるスレッドを明確にするためにこれを行っています。そのため、毎回呼び出して通知を投稿するたびに余分なルックアップを行うのを避けるために[NSNotificationCenter defaultCenter]、静的変数を 1 回だけ作成する必要があると考えました。

static NSNotificationCenter *defaultCenter;
+(void)postNotificationName:(NSString*)name onMainThread:(BOOL)mainThread withObject:(id)object
{
    if(!defaultCenter)
        defaultCenter = [NSNotificationCenter defaultCenter];
    if(mainThread) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [defaultCenter postNotificationName:name object:object];
        });
    } else {
        [defaultCenter postNotificationName:name object:object];
    }
}

私がしていることは安全ですか?defaultCenterが最初にバックグラウンド スレッドで定義され、その後メイン スレッドで再度使用された場合はどうなりますか? これは問題を引き起こしていますか? これを行うより良い方法はありますか?

4

2 に答える 2

2

静電気に関してはジョーに同意します。さらに、アプリで defaultCenter の呼び出しとキャッシュされた値の使用の違いを測定することさえできれば、私は非常に驚かれることでしょう。

おそらく、非常に高速なdispatch_onceなどですでに実装されています。

さらに、適切なスレッドで確実に通知を受け取るために、既存のものを使用することをお勧めしますか?

既存の方法はどうですか、

- (id)addObserverForName:(NSString *)name
                  object:(id)obj
                   queue:(NSOperationQueue *)queue
              usingBlock:(void (^)(NSNotification *))block

いくつかの利点があります。まず、ブロックベースの API であるため、通知の処理に優れています。処理コードは、本来あるべき場所にあります。

とにかく、3 番目のパラメーターに注意してください。操作キューを指定すると、送信元のスレッドに関係なく、そのキューで通知が受信されます。

また、受信者が通知を処理するキューを指定し、送信者をその責任から分離するため、よりクリーンなインターフェイスでもあります。

于 2012-08-16T23:48:08.663 に答える
2

このために静的変数を作成せず、defaultCenter毎回取得することをお勧めします。それ以外の場合は、適切なロック メカニズムを作成する必要があります。これにより、既に実装されているロック チェックが重複する可能性がありdefaultCenter、パフォーマンスやスレッドの安全性が低下する可能性があります。それでもこのルートに進みたい場合は、Objective-C シングルトンはどのように見えますか?という質問を見てください。

于 2012-08-16T15:21:13.607 に答える