[英]@Synchronized in a lazy init in Swift
我試圖將線程安全性添加到一個懶惰的初始化NSPersistantStoreCoordinator中。 我聽說過Objective-c中的@synchronized方法在Swift中不存在。因此,我使用的是“ objc_sync_enter(self)”和“ objc_sync_exit(self)”方法。此方法已在不同的stackoverflow線程中提出作為@synchronized替換。雖然我無法使其正常工作,但這是我的代碼:
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.