【问题标题】:Delete a Core Data stack without using -lock method不使用 -lock 方法删除 Core Data 堆栈
【发布时间】:2015-04-09 14:09:39
【问题描述】:

Core Data ManagedObjectContext -lock 方法在 iOS 8 中已弃用。但是,直到今天,我已经能够编写以下代码来删除我的 Core Data Stack,而不会发出任何警告:

// Delete Core Data stack
if let PSC = managedObjectContext.persistentStoreCoordinator {
    if let PS = PSC.persistentStores.first as? NSPersistentStore {
        let storeURL = PSC.URLForPersistentStore(PS)

        managedObjectContext.lock()
        managedObjectContext.reset()

        var error: NSError?
        if !PSC.removePersistentStore(PS, error: &error) {
            println("Unresolved error \(error), \(error!.userInfo)")
            abort()
        }
        if !NSFileManager.defaultManager().removeItemAtURL(storeURL, error: &error) {
            println("Unresolved error \(error), \(error!.userInfo)")
            abort()
        }
        if PSC.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error) == nil {
            println("Unresolved error \(error), \(error!.userInfo)")
            abort()
        }

        managedObjectContext.unlock()
    }
}

使用 Xcode 6.3 和 Swift 1.2,我现在收到带有以下行的警告:

self.managedObjectContext.lock()
self.managedObjectContext.unlock()

'lock()' 在 iOS 8.0 版中已弃用:使用队列样式上下文 和 -performBlockAndWait: 代替

如何在不使用-lock方法的情况下重写之前的代码?我只是看不出-performBlockAndWait: 是如何替换它的。

【问题讨论】:

    标签: swift core-data ios8 nsmanagedobjectcontext


    【解决方案1】:

    我并不经常需要删除这样的持久存储,但原则上我不明白为什么performBlockAndWait: 不起作用。该方法所做的只是确保块中的代码在上下文的串行队列上运行,无论是私有队列还是主队列。它应该和以前调用 lock 一样有效,如果您确保在可能访问上下文的任何地方都使用块式调用。

    【讨论】:

      【解决方案2】:

      您应该锁定持久存储协调器本身,而不是上下文。

      【讨论】:

      • NSPersistentStoreCoordinator-lock 方法在 iOS8 中也已弃用。
      猜你喜欢
      • 2012-02-11
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多