Ios @在Swift中的惰性初始化中同步

Ios @在Swift中的惰性初始化中同步,ios,multithreading,swift,thread-safety,lazy-loading,Ios,Multithreading,Swift,Thread Safety,Lazy Loading,我正在尝试将线程安全性添加到懒惰的init nspersistantstorecordinator。我听说objective-c中的@synchronized方法在Swift中不存在。因此,我使用的是“objc_sync_enter(self)”和“objc_sync_exit(self)”方法。这种方法在不同的stackoverflow线程中被提出作为@synchronized replacement。但我无法让它工作。下面是我的代码: lazy var psc:NSPersisten

我正在尝试将线程安全性添加到懒惰的init nspersistantstorecordinator。我听说objective-c中的@synchronized方法在Swift中不存在。因此,我使用的是“objc_sync_enter(self)”和“objc_sync_exit(self)”方法。这种方法在不同的stackoverflow线程中被提出作为@synchronized replacement。但我无法让它工作。下面是我的代码:

    lazy var psc:NSPersistentStoreCoordinator? = {

    /* objc_sync_enter(self) */

    let persistantStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: self.model)

    let documentsURL = self.applicationDocumentsDirectory()
    let storeURL = documentsURL.URLByAppendingPathComponent("Model")

    var error: NSError? = nil
    if persistantStoreCoordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: self.persistantStoreOptions(), error: &error) == nil {
        println("Error adding persistent store: \(error)")
        abort()
    }
    /* objc_sync_exit(self) */

    return persistantStoreCoordinator

}()
我在理解在这种情况下应该将return语句放在何处时遇到问题。我试图在返回之后和之前放置objc_sync_exit(self),但运气不佳。对于这种情况,是否有某种最佳做法? 我真正的问题是,在我的应用程序中,persistentStoreCoordinator在被另一个线程创建时被一个线程访问,这使得应用程序崩溃。这就是我想使用@synchronized(self)的原因。

这对我有效:

    private lazy var persistentStoreCoordinator : NSPersistentStoreCoordinator? = {

            if !NSFileManager.defaultManager().fileExistsAtPath(self.filePath!) {
                let bundlePath : String = NSBundle.mainBundle().pathForResource(self.filePath!.lastPathComponent.stringByDeletingPathExtension, ofType: "momd")!
                NSFileManager.defaultManager().copyItemAtPath(bundlePath, toPath:self.filePath!.stringByDeletingLastPathComponent.stringByAppendingPathComponent(bundlePath.lastPathComponent), error: nil)
            }

            let dataBaseURL : NSURL = NSURL(fileURLWithPath: self.filePath!)!
            let options : Dictionary = [NSMigratePersistentStoresAutomaticallyOption : true, NSInferMappingModelAutomaticallyOption : true]
            var coordinator : NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel:self.model!)
            coordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: dataBaseURL, options: options, error: nil)

            return coordinator

    }()

private func getFilePath() -> NSString {
        let paths: NSArray = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
        let path = paths[0].stringByAppendingPathComponent("data")

        if !NSFileManager.defaultManager().fileExistsAtPath(path) {
            NSFileManager.defaultManager().createDirectoryAtPath(path, withIntermediateDirectories: true, attributes: nil, error: nil)
        }
        return path.stringByAppendingPathComponent("Database.sqlite")
    }
拿你需要的;)
编辑:self.filePath=self.getFilePath()

您的代码与我的代码基本相同。为了更清晰起见,我编辑了我的问题。我的问题是,persistentStoreCoordinator正在被一个线程访问,而另一个线程正在同时创建,这使得应用程序崩溃。您应该为允许创建和使用私有persistentStoreCoordi的类创建一个单例nator类var sharedDatabase:Database{struct Static{Static let instance:Database=Database()}return Static.instance}确保在访问此类时始终使用Database.sharedDatabase