2016-07-30 43 views
2

在Swift中声明全局变量的最佳方式是什么?我正在使用Singletons来保存内存中的对象。此外我可以从任何地方访问它们。iOS:处理全球财产的最佳方式

但是由于数组在swift中不是线程安全的,这种模式是否也会解决并发性?有更好的存储方式吗?全球物业的网络资源?

E.g.

class Repository { 

    static let sharedInstance = Repository() 

    var objects:[String] = [] 
} 
+4

无关手头上的问题,宣告单身的这种令人费解的方法可以追溯到Swift 1.x,但不再需要。现在只需要'class Repository {static let sharedInstance = Repository()}'。 – Rob

+2

重新并发,不,这不是线程安全的。为了使这个线程安全,你需要将'objects'设置为private,然后定义你自己的方法来检索和更新被同步的方法(使用GCD或者锁)。 – Rob

+0

如果您需要线程安全性来访问属性或数组,那么我建议您实现一个串行GCD队列来控制该访问。 –

回答

1

跨线程的阵列是安全的。这是写作不是。有关如何以线程安全的方式访问阵列,请参见this question

你实现共享实例方法过于冗长,将在斯威夫特3.使用延迟初始化,而不是被弃用:

class Repository { 
    static var sharedInstance = { Void -> Repository in 
     let tmp = Repository() 
     tmp.objects = ["Hello", "World"] 
     return tmp 
    }() 

    var objects:[String] = [] 
} 
+0

这是关于编辑或原始问题的代码示例吗? – midori

+0

我读了'static let sharedInstance = Repository()'会隐式地执行'dispatch_once' – midori