gpt4 book ai didi

ios - 当有两个不同的地方发出信号和等待时如何使用条件

转载 作者:行者123 更新时间:2023-11-29 03:06:03 25 4
gpt4 key购买 nike

这是我在方法中的伪代码:

NSCondition condition = [[NSCondition alloc] init];
int predicate = 0;

dispatch_sync(dispatch_get_main_queue(), ^
{
[condition lock]; // Lock-0
});

bindBlock1ForDataReceived(^()
{
// Not main thread here.
// Get on main thread, because lock and unlock must be run on same thread.
dispatch_sync(dispatch_get_main_queue(), ^
{
predicate = 1;
[condition signal];
[condition unlock]; <<<<---- "unlocked when not locked"
});
});

bindBlock2ForNoDataAvailable(^()
{
// Not main thread here.
// Get on main thread, because lock and unlock must be run on same thread.
dispatch_sync(dispatch_get_main_queue(), ^
{
predicate = 2;
[condition signal];
[condition unlock];
});
});

[condition lock]; // Lock-1
while (predicate == 0)
{
[condition waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.0]];
}
[condition unlock];

if (predicate == 2)
{
[condition lock]; // Lock-2
[condition waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];
[condition unlock];
}

问题是当第一个事件 2 发生然后是事件 1 时,我从 iOS(见上文)收到“未锁定时解锁”警告。

现在让我解释一下我要完成的工作:这是数据 getter 的一部分。正常情况下数据被接收并且 block1 被执行:没有问题。有时无数据 block 2 会先被虚假地执行,紧接着是 block 1;这是我收到 NSCondition 警告的时候。为了捕捉到这种罕见的情况,我等待了 2.0 秒。这是发生了什么:

  • Block2 发出条件信号。
  • Lock-1 落空。
  • predicate 不再是 0 因此无需等待。
  • 条件再次解锁。
  • 然后我们继续执行条件 (predicate == 2) 为真的 if 语句。
  • 该方法立即获得 Lock-2。 <<<< 根本原因
  • 随后该方法等待 2.0 秒。
  • 在这 2 秒内执行 block1 并发出条件信号。
  • 然后 block1 解锁条件,方法也解锁。

根本原因(见上)是锁被方法(worker/consumer)获取,而它本应由数据生产者获取。我花了很多时间试图解决这个问题;我的想法之一是使用两个 NSCondition,但我无法弄清楚这一点,因为事情交织在一起。

注意:我觉得奇怪的是警告没有出现在 if 语句中的 unlock 处。

感谢您的宝贵时间!

最佳答案

使用 more than lock 的最简单方法是使用

dispatch_group_t confirmGroup = dispatch_group_create(); // 1

if (requestContacts) {
dispatch_group_enter(confirmGroup); // 2
[Extractor requestAccessAddressBook:^(BOOL isComplete) {
if (isComplete) {
dispatch_group_leave(confirmGroup); //2
}
}];


}
if (requestEvent) {
dispatch_group_enter(confirmGroup); // 3
[Extractor requestAccessEvents:^(BOOL isComplete) {
if (isComplete) {
dispatch_group_leave(confirmGroup); // 3
}
}];
}
if (requestPhoto) {
dispatch_group_enter(confirmGroup); // 4
[Extractor requestAccessPhotos:^(BOOL isComplete) {
if (isComplete) {
dispatch_group_leave(confirmGroup); //4
}
}];
}
NSLog(@"dispatch_group_wait confirmations");
dispatch_group_wait(confirmGroup, DISPATCH_TIME_FOREVER); // 5

关于ios - 当有两个不同的地方发出信号和等待时如何使用条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22762438/

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