アプリに設定パネルがあります。ユーザーがボタンを押すたびに、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];
このコードを変更して正しく機能させる方法について提案がある場合、またはこれを達成するための別の解決策がある場合は、大歓迎です! ありがとうございました。