Objective-C:getNotificationSettingsWithCompletionHandler从完成处理程序分配给变量。怎么样?

时间:2020-03-17 18:25:12

标签: objective-c

我在一个非常简单的问题上堆积如山。上一次没有大量使用Objective-C。有人可以帮助我吗?

+(UNAuthorizationStatus) mCheckPermissions {

__block UNAuthorizationStatus oOutput = 0;

UNUserNotificationCenter* oCenter = [UNUserNotificationCenter currentNotificationCenter];
[oCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
    oOutput = settings.authorizationStatus;
}];

return oOutput;
}

我需要将值分配给完成处理程序的oOutput。目前,它还没有正确地提升价值。我想念什么?并且请不要回复我与Swift相关的问题。问题是关于Objective-C。

2 个答案:

答案 0 :(得分:0)

您缺少的是getNotificationSettingsWithCompletionHandler异步的。

这意味着该块(您的settings.authorizationStatus)中的“答案”会在整个mCheckPermissions方法(包括{{1 }}。执行顺序如下:

return


因此,不可能从外部方法+(UNAuthorizationStatus) mCheckPermissions { __block UNAuthorizationStatus oOutput = 0; /* 1 */ UNUserNotificationCenter* oCenter = [UNUserNotificationCenter currentNotificationCenter]; /* 2 */ [oCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { /* 4 */ oOutput = settings.authorizationStatus; }]; /* 3 */ return oOutput; } 返回到达该块的值。 (除非您的口袋里有一台时间机器,否则您可以潜入未来并找出结果 。)

答案 1 :(得分:0)

找到解决方案。问题已解决。

+(UNAuthorizationStatus) mCheckPermissions {

__block UNAuthorizationStatus oOutput = UNAuthorizationStatusNotDetermined;
dispatch_semaphore_t oSemaphore = dispatch_semaphore_create(0);

UNUserNotificationCenter* oCenter = [UNUserNotificationCenter currentNotificationCenter];
[oCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
    oOutput = settings.authorizationStatus;
    dispatch_semaphore_signal(oSemaphore);
}];

if (![NSThread isMainThread]) {
    dispatch_semaphore_wait(oSemaphore,DISPATCH_TIME_FOREVER);
} else {
    while (dispatch_semaphore_wait(oSemaphore,DISPATCH_TIME_NOW)) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0]];
    }
}

return oOutput;
}
相关问题