gpt4 book ai didi

ios - 某些设备上的 `dispatch_semaphore_wait()` 有问题吗?

转载 作者:行者123 更新时间:2023-11-28 18:21:36 25 4
gpt4 key购买 nike

我正在使用开源软件 TMCache .它将昂贵的数据保存到异步缓存中。还有一种同步方法。

它使用dispatch_semaphore_wait()等待操作结束。


Source

- (id)objectForKey:(NSString *)key
{
if (!key)
return nil;

__block id objectForKey = nil;

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

[self objectForKey:key block:^(TMCache *cache, NSString *key, id object) {
objectForKey = object;
dispatch_semaphore_signal(semaphore);
}];

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

#if !OS_OBJECT_USE_OBJC
dispatch_release(semaphore);
#endif

return objectForKey;
}

这在我的机器上运行良好。在同事的机器上它没有。程序在 dispatch_semaphore_wait() 处停止工作。这对我来说绝对不可重现。

上面的方法在tableView:viewForTableColumn:row:中调用,
所以它在主队列中执行。

知道为什么会这样吗?我必须在另一个队列中使用该方法吗?

最佳答案

很可能您的线程用完了。应该释放 dispatch_semaphore_wait() 的 dispatch_semaphore_signal(semaphore) 需要在新线程中执行(有关详细信息,请参阅 objectForKey:block:)。如果操作系统无法分派(dispatch)新线程,您就会卡住,因为没有人会向您发送 dispatch_semaphore_signal。

它发生的频率和时间取决于计算机/设备的速度、您滚动表格的速度等。这就是为什么您无法在您的计算机上重现此问题。

这里的快速解决方案是通过使用相同的调度信号量方法将超时设置为 DISPATCH_TIME_NOW 来保持较低的线程数,因为您可能不会阻塞主队列。

不过,我更愿意改变 TMCache.m 的工作方式。我认为在这种情况下分派(dispatch)信号量方法是不合理的——以牺牲可靠性为代价获得代码简洁性(将异步方法包装到同步方法中)对我来说似乎不正确。我曾经用异步方法包装同步方法,但反之亦然。

这里是修复

https://github.com/rushproject/TMCache

请注意,只有同步的 objectForKey 方法被修补了。

关于ios - 某些设备上的 `dispatch_semaphore_wait()` 有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19306934/

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