簡體   English   中英

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

[英]@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM