相关疑难解决方法(0)

在Swift 3中等效的dispatch_barrier_async

重构一个同事的代码,我正在寻找dispatch_barrier_asyncswift 3中的等价物.有很多队列正在运行,他的设计只是阻止这个队列,而且只针对这个单一的操作.

// Swift 2.3
func subscribe(subscriber: DaoDelegate) {
  dispatch_barrier_async(self.subscribers.q) { // NOTE: barrier, requires exclusive access for write
    //...
  }
}

// Swift 3 
func subscribe(subscriber: DaoDelegate) {
  (self.subscribers.q).async { // (Not equivalent, no barrier on the concurrent queue)
    //...
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以在Swift 3中保留相同的功能而无需重构所有队列类型吗?

concurrency swift3

23
推荐指数
1
解决办法
4634
查看次数

swift中的线程安全单例

我有和应用程序有一个单一的存储整个应用程序的信息.但是,当使用来自不同线程的单例时,这会产生一些数据争用问题.

这里有一个非常虚拟和简单化的问题版本:

独生子

class Singleton {
    static var shared = Singleton()

    var foo: String = "foo"
}
Run Code Online (Sandbox Code Playgroud)

单例的使用(为简单起见,来自AppDelegate)

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        DispatchQueue.global().async {
            var foo = Singleton.shared.foo // Causes data race
        }

        DispatchQueue.global().async {
            Singleton.shared.foo = "bar"   // Causes data race
        }

        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法确保单例是线程安全的,所以它可以在应用程序的任何地方使用,而不必担心你在哪个线程?

这个问题不是在Swift使用dispatch_once单例模型的重复,因为(如果我理解正确的话)那里他们正在解决访问单例对象本身的问题,但不能确保其属性的读写完成线程安全.

thread-safety swift swift4

13
推荐指数
1
解决办法
3994
查看次数

标签 统计

concurrency ×1

swift ×1

swift3 ×1

swift4 ×1

thread-safety ×1