gpt4 book ai didi

swift - 属性包装器和 SwiftUI 环境 : how can a property wrapper access the environment of its enclosing object?

转载 作者:行者123 更新时间:2023-11-28 11:27:45 28 4
gpt4 key购买 nike

@FetchRequest SwiftUI 附带的属性包装器有助于声明在 Core Data 存储发生变化时自动更新的属性。您只需提供一个获取请求:

struct MyView: View {
@FetchRequest(fetchRequest: /* some fetch request */)
var myValues: FetchedResults<MyValue>
}

没有托管对象上下文,提取请求无法访问存储。此上下文必须在 View 的环境中传递。

现在我很困惑。

是否有任何公共(public) API 允许属性包装器访问其封闭对象的环境,或者让 SwiftUI 将此环境提供给属性包装器?

最佳答案

我们不知道 SwiftUI 的具体内部实现方式,但我们可以根据现有信息做出一些有根据的猜测。

首先,@propertyWrapper不会从它们包含的结构/类中自动访问任何类型的上下文。你可以看看the spec为了证明这一点。这个在演进过程中讨论过几次,但没有被采纳。

因此,我们知道框架必须在运行时发生一些事情才能将 @EnvironmentObject(这里是 NSManagedObjectContext)注入(inject)到 @FetchRequest。有关如何通过 Mirror API 执行类似操作的示例,您可以查看 my answer in this question . (顺便说一下,那是在 @Property 可用之前编写的,因此具体示例不再有用)。

然而,this article建议使用 @State 的示例实现并推测(基于程序集转储),而不是使用镜像 API,SwiftUI 使用 TypeMetadata速度:

Reflection without Mirror

There is still a way to get fields without using Mirror. It's using metadata.

Metadata has Field Descriptor which contains accessors for fields of the type. It's possible to get fields by using it.

My various experiments result AttributeGraph.framework uses metadata internally. AttributeGraph.framework is a private framework that SwiftUI use internally for constructing ViewGraph.

You can see it by the symbols of the framework.

$ nm /System/Library/PrivateFrameworks/AttributeGraph.framework/AttributeGraphThere is AG::swift::metadata_visitor::visit_field in the list of symbols. i didn't analysis the whole of assembly code but the name implies that AttributeGraph use visitor pattern to parse metadata.

关于swift - 属性包装器和 SwiftUI 环境 : how can a property wrapper access the environment of its enclosing object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57668997/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com