我搜索过Swift书,但找不到Swift版本的@synchronized.如何在Swift中进行互斥?
我有快速的线程问题.我有一个包含一些对象的数组.在委托上,类每秒都会获得新对象.之后我必须检查对象是否已经在数组中,所以我必须更新对象,否则我必须删除/添加新对象.
如果我添加一个新对象,我必须首先通过网络获取一些数据.这是handelt经过一个街区.
现在我的问题是,如何同步这项任务?
我尝试了一个dispatch_semaphore,但是这个阻止了UI,直到块完成.
我还尝试了一个简单的bool变量,它检查块当前是否执行并同时跳过compare方法.
但这两种方法都不理想.
什么是管理阵列的最佳方式,我不想在阵列中有重复的数据.
从 macOS 10.12 开始,OSSpinLock已弃用。XCode 错误消息敦促我os_unfair_lock_unlock()改用。
作为我依赖的一些开源东西的遗产,我从 2010 年开始使用 RegexKitLite。
如何转换自旋锁类型?简单的解锁和锁定我可以管理,但这些比较让我头疼:
if(rkl_cacheSpinLock != (OSSpinLock)0) { ... }
Run Code Online (Sandbox Code Playgroud)
rkl_cacheSpinLock是类型os_unfair_lock并已初始化。OSSpinLock 似乎是 type int,所以这个 if 语句显然不起作用。
任何人都可以指出我解决这个问题的正确方法吗?我对 C 不太熟悉,也不太了解指针的算术运算。
编辑
在学习了一些 C 之后,我开始了解类型转换。我想出了一个似乎有效的解决方案。我对这个级别的操作系统功能的理解是不存在的。os_unfair_lock 对于傻瓜来说并没有太多的记录,但看起来我没有破坏任何东西。
if (rkl_cacheSpinLock._os_unfair_lock_opaque != 0) { ... }
我制作了一个自定义属性包装器,它提供了一种使用os_unfair_lock. 在启用 TSAN 的情况下测试我的包装器后,在使用锁定获取时报告了访问争用错误os_unfair_lock_lock(如下图所示)
不知何故,TSAN 报告认为线程安全的锁定结构并非如此。这里发生了什么?
swift ×3
arrays ×1
concurrency ×1
data-race ×1
ios ×1
locking ×1
macos ×1
mutex ×1
objective-c ×1
read-write ×1
regex ×1
regexkitlite ×1
spinlock ×1