2013-03-08 4 views
4

새 메시지가 나타나면 매 5 초마다 실행되는 기능이 있습니다. 아래 코드를 사용하여 탭 표시 줄 항목의 배지 값을 업데이트합니다.Tab Bar 항목의 배지 값 업데이트시 지연

NSString *chkUrl = @"http://domain.com/script.php"; 
    NSURL *url = [[[NSURL alloc] initWithString:chkUrl] autorelease]; 
    NSError *error = nil; 
    NSStringEncoding encoding; 
    NSString *returnHTML = [[NSString alloc] initWithContentsOfURL:url usedEncoding:&encoding error:&error]; 

    int totalNewMessages = [[returnHTML stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] intValue]; 
    AppDelegate *mainDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSLog(@"badge before:%@",[[mainDelegate.tabBarController.viewControllers objectAtIndex:2] tabBarItem].badgeValue); 
    [[mainDelegate.tabBarController.viewControllers objectAtIndex:2] tabBarItem].badgeValue = [NSString stringWithFormat:@"%d",totalNewMessages]; 
    NSLog(@"badge after:%@",[[mainDelegate.tabBarController.viewControllers objectAtIndex:2] tabBarItem].badgeValue); 

문제는 배지 값이 즉시 업데이트되지 않는다는 것입니다. 어쩌면 4 번째 호출 중 3 번째 호출에서 업데이트 될 것입니다! 뭐 잘못 됐어! 아니면 iOS의 버그입니까?

해결 방법으로 모든 업데이트에서 위의 행을 10 번 반복했지만 다시 업데이트하지 않으므로 배지 값을 업데이트하는 데 지연이 발생하므로 업데이트 행을 다시 실행하지 않아도됩니다!

BTW,이 문제는 내가 문제 :

는 5 초마다 실행중인

내 기능은 아래의 코드 내부에 이었다 발견 아이폰 OS 6.1

+0

배지에 전달되는 내용을 보려면 중단 점을 설정하여 'totalNewMessages' 값을 검사하지 않는 이유는 무엇입니까? 어쩌면 비동기 호출이 있니? 첫 번째 가치는 어떻게 얻습니까? – Alladinian

+0

@Alladinian 배지 값을 업데이트하기 전에 & 업데이트 한 후에 NSLog에서 올바른 값을 표시하지만 탭 표시 줄 항목 배지에서 몇 초 지연됩니다! – DeZigny

+0

'totalNewMessages'의 값을 설정하는 곳에 코드 부분을 게시 할 수 있습니까? – Alladinian

답변

3

모두와 엑스 코드 4.6 시뮬레이터에 & 내 아이폰 5 일어나는

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
             (unsigned long)NULL), ^(void) { 
    [self checkNewMessages]; 
}); 

다음과 같이 변경하면 매력적입니다.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self checkNewMessages]; 
    }); 
});