gpt4 book ai didi

objective-c - 如何使用 completionHandlers 等待多个函数?

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:29 27 4
gpt4 key购买 nike

我目前正在为 React-Native 开发 HomeKit 的桥梁,我必须读取 HomeKit 值才能返回我的 Javascript 代码。

要读取特征的最新值,我们必须使用 readValueWithCompletionHandler值(value)在完成之前还没有准备好。因此,我必须阅读其中的 6 个特征并将每个特征分配给我的 NSMutableDictionary 对象以返回给 React-Native 来处理。

与其将每个读取嵌套在前一个 completionHandler 中,并在最后一个 return accObject 中嵌套,等待所有 completionHandlers 的最干净的方法是什么在 return 之前完成。

我已经搜索了一段时间,查看了 semaphoresDispatchGroup 和其他几个解决方案,但对如何解决这个问题没有很好的想法。

对于(粗略的)示例:

NSMutableDictionary *accObject = [[NSMutableDictionary alloc] initWithCapacity: 6];

[charac1 readValueWithCompletionHandler:^(NSError *error) {
if (error) {
RCTLog(@"ERROR READING HOMEKIT VALUE: %@", error);
}
RCTLog(@"READ SETPOINT VALUE: %@", charac1.value);
accObject[@"charac1"] = charac1.value;
}];
...

[charac6 readValueWithCompletionHandler:^(NSError *error) {
if (error) {
RCTLog(@"ERROR READING HOMEKIT VALUE: %@", error);
}
RCTLog(@"READ SETPOINT VALUE: %@", charac6.value);
accObject[@"charac6"] = charac6.value;
}];

return accObject;

最佳答案

你可以使用 dispatch_semaphore_wait() 等待 dispatch_semaphore_t你可以使用这个过程为我工作。

     dispatch_semaphore_t sem = dispatch_semaphore_create(0);


dispatch_async(dispatch_get_main_queue(), ^{
NSMutableDictionary *accObject = [[NSMutableDictionary alloc] initWithCapacity: 6];

[charac1 readValueWithCompletionHandler:^(NSError *error) {
if (error) {
RCTLog(@"ERROR READING HOMEKIT VALUE: %@", error);
}
RCTLog(@"READ SETPOINT VALUE: %@", charac1.value);
accObject[@"charac1"] = charac1.value;
}];
...

[charac6 readValueWithCompletionHandler:^(NSError *error) {
if (error) {
RCTLog(@"ERROR READING HOMEKIT VALUE: %@", error);
}
RCTLog(@"READ SETPOINT VALUE: %@", charac6.value);
accObject[@"charac6"] = charac6.value;
}];


dispatch_semaphore_signal(sem);
});

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
return accObject;

关于objective-c - 如何使用 completionHandlers 等待多个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52189052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com