4

新しいメッセージをチェックするために5秒ごとに実行される関数があります。新しいメッセージがトリガーされた場合、次のコードを使用してタブバーアイテムのバッジ値を更新しています。

    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回繰り返しましたが、これも更新されないため、バッジ値の更新が遅れるという問題があります。更新行を再実行する必要はありません。

ところで、この問題はXcode4.6シミュレーターとiOS6.1を搭載したiPhone5の両方で発生しています。

4

1 に答える 1

3

私は問題を見つけました:)

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];
    });
});
于 2013-03-10T17:40:42.453 に答える