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