很抱歉,上面的答案是错误的。
对象的初始化程序不能执行任何异步操作。它的工作是立即生成对象,并初始化其所有属性
--> 这是绝对错误的。
10 年来,我已经在 Objective-C/C/Swift 中成功完成了大量的多线程编程:没有任何内存泄漏、数据访问或访问竞争。
我已经成功地在制作游戏时异步初始化了一些对象,特别是。当我需要以高性能方式初始化尽可能多的对象以及许多惰性对象时。
初始化器可以异步执行,但这里的问题是以下转义闭包中的“self”无法修改。
init(reference: DocumentReference) {
FirestoreService().fetchDocument(documentReference: reference) {
(request: RequestModel) in
self.request = request
}
初始化程序中的闭包详细信息是
{
@escaping [unowned self] (request: RequestModel) in
self.request = request
}
因此,闭包中的“self”将比该函数更长寿。
上面的代码似乎是 View 类型的一部分,作为结构体创建。
From https://docs.swift.org/swift-book/LanguageGuide/Closures.html https://docs.swift.org/swift-book/LanguageGuide/Closures.html,
“如果 self 是结构或枚举的实例,则始终可以隐式引用 self。但是,当 self 是结构或枚举的实例时,转义闭包无法捕获对 self 的可变引用。结构和枚举不允许共享可变性,如结构和枚举是值类型中所述。”
因此,“自我”不可能是可变的。
这就是为什么您的代码收到错误消息:“转义闭包捕获变异的‘self’参数”。
更好的解决方案是将部件移动到修改器内的另一个位置,例如“didAppear()”。
因为提问者在这里没有提供更多他或她的代码。
我在这里无法提供更具体的答案。