为什么错误''自我'在self.init call'之前使用在init中使用DispatchQueue时?

时间:2018-01-01 00:53:26

标签: ios iphone swift swift3

我在(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它可以正常工作,但我需要实现它,因为应用程序没有线程安全。提前谢谢!

1 个答案:

答案 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))
    }
}