我有一个后台线程(NSOperation),用于为用户获取新消息。这是通过AppDelegate中的计时器调用的。我有一个在MainThread上执行的方法,它应该在我的MessagesViewController中调用一个类方法。这一切都有效(我有日志语句来表明它正在使用MessagesViewController中的类方法.MessageViewController中的方法只做一件事:
-(void)updateMessageBadgeNumberWithStringVal:(NSString *)badgeNum {
[[[[self.tabBarController tabBar] items] objectAtIndex:2] setBadgeValue:badgeNum];
NSLog(@"updateMessageBadgeNumberWithStringVal Called val= %@", badgeNum);
}
日志语句触发,但BadgeValue不会更改。顺便说一下,我使用的是Storyboard,因此TabBarController没有在AppDelegate中实例化。
有什么想法吗?
编辑:在我的NSOperation课程中,我这样做:[self performSelectorOnMainThread:@selector(updateMessageBadgeNumberWithString:)
withObject:badgeNum
waitUntilDone:NO];
该方法也存在于我的NSoperation类中:
-(void)updateMessageBadgeNumberWithString:(NSString *)badgeNum {
MessagesViewController *mvc = [[MessagesViewController alloc] init];
[mvc updateMessageBadgeNumberWithStringVal:badgeNum];
//mvc = nil;
}
那么这不是调用更新主线程UI的方法吗?
答案 0 :(得分:1)
不要直接调用updateMessageBadgeNumbeWithStringVal:
,而是执行此操作:
[self performSelectorOnMainThread:@selector(updateMessageBadgeNumbeWithStringVal:) withObject:badgeNum waitUntilDone:NO];
您不应该在后台线程上更新UI,只需在主线程上更新。