objC - 信号量不会恢复主线程

时间:2015-04-03 19:25:20

标签: ios objective-c objective-c-blocks semaphore

所以,我正在尝试创建一个小项目,告诉用户他有多少粉丝。

目前我正在使用Instagram Kit,它使用异步块。

我的目标是让程序在后台获取时更新它的数据,并将图标旁边的徽章值更改为关注者数量。我在后台获取方面遇到了一些麻烦,导致获取Instagram信息的块在获取后完成,因此没有数据被检索。

我读到了信号量并决定使用它们。在我向后台提取中调用的方法添加了一些代码后,它执行以下操作:

fetch开始(我得到“我们开始”NSLog),然后主线程被信号量冻结。它应该通过块的“withSuccess”/“failure”部分的完整性来恢复。然而它变得糟透了。没有别的事情发生。我很困惑。

我该怎么办?

(以下是在获取期间调用的方法,我在本地存储instagram令牌,因此无需每次都请求它)

-(IBAction) backgroundActions {

    NSLog(@"We begin");

    dispatch_semaphore_t sem = dispatch_semaphore_create(0);

    [[InstagramEngine sharedEngine] getSelfUserDetailsWithSuccess:^(InstagramUser *user) {     
            NSLog(@"%d",user.followedByCount);

            [UIApplication sharedApplication].applicationIconBadgeNumber = user.followedByCount;

            [[UIApplication sharedApplication] cancelAllLocalNotifications];
            UILocalNotification *localNotification = [[UILocalNotification alloc] init];
            NSDate *now = [NSDate date];
            localNotification.fireDate = now;
            localNotification.alertBody = [NSString stringWithFormat:@"You have %d followers.", user.followedByCount];
            localNotification.soundName = UILocalNotificationDefaultSoundName;
            localNotification.applicationIconBadgeNumber =  user.followedByCount;
            [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

            dispatch_semaphore_signal(sem);


    } failure:^(NSError *error) {
        dispatch_semaphore_signal(sem);
    }];

    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

}

1 个答案:

答案 0 :(得分:0)

您所做的是使异步getSelfUserDetailsWithSuccess变得同步。这就是你的主线程冻结的原因。

否则代码看起来很好。删除信号量并让更新异步发生有什么问题?