从NSOperation线程更新UITabBar徽章图标

时间:2011-12-12 23:27:55

标签: objective-c ios

我有一个后台线程(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的方法吗?

1 个答案:

答案 0 :(得分:1)

不要直接调用updateMessageBadgeNumbeWithStringVal:,而是执行此操作:

[self performSelectorOnMainThread:@selector(updateMessageBadgeNumbeWithStringVal:) withObject:badgeNum waitUntilDone:NO];

您不应该在后台线程上更新UI,只需在主线程上更新。