斯威夫特 - ' init()'在iOS 9.0中已弃用:请改用-initWithConcurrencyType :.

时间:2015-11-14 12:51:14

标签: ios swift ios9 swift2.1

我的模型上有错误(黄色警告):

    var managedObjectContext = NSManagedObjectContext()
  

'init()' was deprecated in iOS 9.0: Use -initWithConcurrencyType: instead

造成这种情况的原因是什么?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:8)

将其更改为:

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)

答案 1 :(得分:3)

Apple改变了核心数据的工作方式。不要使用init(),而是根据需要/推荐使用initWithConcurrencyType。

根本原因与线程安全和对核心数据对象的异步访问有关。

答案 2 :(得分:1)

一般情况下,当Apple告诉您某些内容已被弃用时,您将始终收到类似

的消息
'init()' was deprecated in iOS 9.0: Use -initWithConcurrencyType: instead

显然,你需要做的是遵循你给出的非常强烈的暗示:不要使用init。阅读initWithConcurrencyType:的内容,找出调用它的正确方法,并通过调用initWithConcurrencyType替换你的init调用:

以此作为对一般问题的回答,因为实际上,你应该能够自己解决这个问题。