- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
@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/
我是一名优秀的程序员,十分优秀!