Rex*_*xha 6 xcode ios swift swiftui
我有一个可以通过两种方式打开的视图。一个包含提供给它的数据,另一个包含对 Firestore 文档的文档引用。我创建了两个构造函数,在第一个构造函数中我提供数据,在另一个构造函数中我提供文档参考。然后我使用此引用进行网络调用,但出现错误:
Escaping closure captures mutating 'self' parameter
关于如何解决这个问题有什么想法吗?
@State var request: RequestModel?
init(request: RequestModel) {
self.request = request
}
init(reference: DocumentReference) {
FirestoreService().fetchDocument(documentReference: reference) { (request: RequestModel) in
self.request = request
}
}
Run Code Online (Sandbox Code Playgroud)
小智 10
很抱歉,上面的答案是错误的。
\n\n\n对象的初始化程序不能执行任何异步操作。它的工作是立即生成对象,并初始化其所有属性
\n
--> 这是绝对错误的。
\n10 年来,我已经在 Objective-C/C/Swift 中成功完成了大量的多线程编程:没有任何内存泄漏、数据访问或访问竞争。
\n我已经成功地在制作游戏时异步初始化了一些对象,尤其是。当我需要以高性能方式初始化尽可能多的对象以及许多惰性对象时。
\n初始化器可以异步执行,但这里的问题是转义闭包中的“self”无法修改。
\ninit(reference: DocumentReference) {\n FirestoreService().fetchDocument(documentReference: reference) { \n (request: RequestModel) in\n self.request = request\n}\nRun Code Online (Sandbox Code Playgroud)\n初始化程序中的闭包详细信息是
\n{ \n @escaping [unowned self] (request: RequestModel) in\n\n self.request = request\n}\nRun Code Online (Sandbox Code Playgroud)\n因此,闭包中的“self”将比函数更长寿。上面的代码似乎是 View 类型的一部分,作为结构体创建。
\n来自https://docs.swift.org/swift-book/LanguageGuide/Closures.html,
\n\n\n“如果 self 是结构体或枚举的实例,则始终可以隐式引用 self。但是,当 self 是结构体或枚举的实例时,转义闭包可以\xe2\x80\x99t 捕获对 self 的可变引用. 结构和枚举不允许共享可变性,如结构和枚举是值类型中所述。”
\n
因此,“自我”不可能是可变的。
\n这就是为什么您的代码收到错误消息:“转义闭包捕获变异的‘self’参数”。
\n更好的解决方案是将部件移动到修改器内的另一个位置,例如“didAppear()”。
\n因为提问者没有在这里提供更多他或她的代码。\n我无法在这里提供更具体的答案。
\n| 归档时间: |
|
| 查看次数: |
8537 次 |
| 最近记录: |