我的在线模型出现错误(黄色警告):
var managedObjectContext = NSManagedObjectContext()
'init()' was deprecated in iOS 9.0: Use -initWithConcurrencyType: instead
这是什么原因造成的?我该如何解决这个问题?
将其更改为:
var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
您可以下载 Apple 的文档以查看更多详细信息。
NSConfinementConcurrencyType
指定上下文将使用线程限制模式。
在 iOS 3.0 及更高版本中可用。
在 iOS 9.0 中已弃用。
或者Command+点击“NSManagedObjectContext”直接到NSManagedObjectContext.h:
@available(iOS, introduced=3.0, deprecated=9.0, message="Use another NSManagedObjectContextConcurrencyType")
case ConfinementConcurrencyType
@available(iOS, introduced=3.0, deprecated=9.0, message="Use -initWithConcurrencyType: instead")
public convenience init()
所以似乎 NSManagedObjectContext() 使用“ConfinementConcurrencyType”来初始化。当Apple在iOS 9.0中弃用“ConfinementConcurrencyType”时,为了连贯性,Apple没有改变init()方法的行为。因此,您最好将另一个 NSManagedObjectContextConcurrencyTypes(PrivateQueueConcurrencyType, MainQueueConcurrencyType) 与另一个 init 方法一起使用:
init(concurrencyType: NSManagedObjectContextConcurrencyType)
Apple 改变了核心数据的工作方式。不要使用 init(),而是根据需要/推荐使用 initWithConcurrencyType。
根本原因与线程安全和对核心数据对象的异步访问有关。
一般来说,当 Apple 告诉你某些东西已被弃用时,你总会收到类似这样的消息
'init()' was deprecated in iOS 9.0: Use -initWithConcurrencyType: instead
很明显,您需要做的是遵循给您的非常强烈的提示:不要使用 init。阅读 initWithConcurrencyType: 的作用,找出你调用它的正确方法,然后用对 initWithConcurrencyType 的调用替换你的 init 调用:
将此作为一般问题的答案,因为实际上,您应该能够自己弄清楚这一点。