我在(Xcode 9)
下面的代码中收到了这些错误:
convenience init(dictionary: [String: AnyObject], context: NSManagedObjectContext) {
guard let entity = NSEntityDescription.entity(forEntityName: "Photo", in: context) else {
fatalError("No Entity name Found")
}
DispatchQueue.main.async {
self.init(entity: entity, insertInto: context)
self.title = dictionary[FlickrClient.JSONResponseKeys.title] as? String
self.path = dictionary[FlickrClient.JSONResponseKeys.mediumURL] as? String
}
}
没有DispatchQueue
。main.async它可以正常工作,但我需要实现它,因为应用程序没有线程安全。提前谢谢!
答案 0 :(得分:4)
问题是您在传递给self
的闭包内使用DispatchQueue.main.async
。当你在一个闭包中使用self
时,它会被闭包捕获,它被视为将self
传递给某个东西。在您初始化self
之前,您无法做到这一点。
另外,请考虑一下。如果允许这样做,初始化程序将在初始化实际完成之前完成,因为主线程仍有工作要做,初始化程序在完成切换后就已完成。
如果需要异步初始化某些内容,请改用工厂模式:
static func make(foo: Foo, bar: Bar, baz: Whatever, handler: (Widget) -> ()) {
DispatchQueue.main.async {
guard let thingy = Thingy(xyzzy: plugh) else { fatalError("I DON'T LIKE SPAM") }
handler(Widget(thingy: thingy))
}
}