2011-12-12 34 views
0

我有一個後臺線程(NSOperation),用於爲用戶獲取新消息。這是通過AppDelegate中的定時器調用的。我有一個在MainThread上執行的方法,它應該在我的MessagesViewController中調用一個類方法。這一切工作(我有日誌報表顯示它是打在MessagesViewController類方法在MessagesViewController的方法做的只有一件事:從NSOperation線程更新UITabBar徽章圖標

-(void)updateMessageBadgeNumberWithStringVal:(NSString *)badgeNum { 
    [[[[self.tabBarController tabBar] items] objectAtIndex:2] setBadgeValue:badgeNum]; 
    NSLog(@"updateMessageBadgeNumberWithStringVal Called val= %@", badgeNum); 
} 

日誌聲明火災,但BadgeValue不會改變。順便說一句,我使用的故事板,因此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

是的,PerformSelectorOnMainThread調用在更新UI的主線程上調用方法。這是不是這樣做的正確方法? –

回答

1

不是直接調用updateMessageBadgeNumbeWithStringVal:的,這樣做:

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

你不應該更新後臺線程的用戶界面,只需在主線程。

+0

查看我上面的編輯 –