1

アプリに設定パネルがあります。ユーザーがボタンを押すたびに、UI が更新されると、オブジェクトは別のスレッドで更新されます。オブジェクトの更新が完了したときにオブジェクト数を更新することになっているメイン ビューに別のラベルがあります (設定パネルが上か下かに関係なく発生したい)。このまさにトピックに関するアップルのドキュメントに従ってみましたが、うまくいかないようです。つまり、メインのView Controllerが何らかの理由で通知を受信しないようです。別のスレッドに渡されたオブジェクトの更新が完了したことをメイン ビュー コントローラーに警告する方法について、何か提案はありますか? これが私が使用しているコードです(そのほとんどはそのドキュメントからコピーされました):

オブジェクト クラス:

[[NSNotificationCenter defaultCenter] postNotificationName: @"ScaleCountUpdated" object: self];

メインビューコントローラー

- (void)setUpThreadingSupport
{
    if (self.notifications) {
        return;
    }
    self.notifications = [[NSMutableArray alloc] init];
    self.notificationLock = [[NSLock alloc] init];
    self.notificationThread = [NSThread currentThread];

    self.notificationPort = [[NSMachPort alloc] init];
    [self.notificationPort setDelegate: self];
    [[NSRunLoop currentRunLoop] addPort: self.notificationPort
                            forMode: (NSString *)kCFRunLoopCommonModes];
}

- (void)handleMachMessage:(void *)msg
{
    [self.notificationLock lock];

    while ([self.notifications count]) {
        NSNotification *notification = [self.notifications objectAtIndex: 0];
        [self.notifications removeObjectAtIndex: 0];
        [self.notificationLock unlock];
        [self processNotification: notification];
        [self.notificationLock lock];
    };

    [self.notificationLock unlock];
}

- (void)processNotification:(NSNotification *)notification{

    if ([NSThread currentThread] != self.notificationThread) {
        // Forward the notification to the correct thread.
        [self.notificationLock lock];
        [self.notifications addObject: notification];
        [self.notificationLock unlock];
        [self.notificationPort sendBeforeDate: [NSDate date]
                                   components: nil
                                         from: nil
                                     reserved: 0];
    } else {
        [self updateScaleCount];
    }
}

- (void)updateScaleCount
{
    NSLog(@"[ScalesViewController - updateScaleCount]: Scales updated from notification center.");
    if([UserDefinedScales areScalesGrouped] == YES){
        self.groupCountLabel.text = [NSString stringWithFormat: @"Group Count: %i", [[UserDefinedScales sortedKeys] count]];
    } else {
        self.groupCountLabel.text = @"Group Count: 1";
    }
    self.scaleCountLabel.text = [NSString stringWithFormat: @"Scale Count: %i", [UserDefinedScales scaleCount]];
}

メイン ビュー コントローラー - ビューが読み込まれました:

[self setUpThreadingSupport];
    [[NSNotificationCenter defaultCenter] addObserver: self
                                             selector: @selector(processNotification:)
                                                 name: @"ScaleCountUpdated"
                                               object: nil];

このコードを変更して正しく機能させる方法について提案がある場合、またはこれを達成するための別の解決策がある場合は、大歓迎です! ありがとうございました。

4

2 に答える 2

0

あなたは正しくやっているように見えます。つまり、通知に登録して送信します。

あなたのコードとあなたが提供した情報からわかる限り、基本的にsetupThreadingSupport.. あなたは間違いなくそれなしでそれをテストする必要があります. あなたが何を達成したいのかわからないが、おそらく単純なブロックで十分なやり過ぎのように見える. バックグラウンド スレッドで通知を聞く必要がある理由はありますか? 通知センターに決めさせないのはなぜですか?

addObserver通知の送受信をログに記録しpostNotificationます。このメカニズムが期待どおりに機能するために必要なのは、これだけです。

于 2013-07-27T19:51:44.447 に答える