FetchRequests 是一个受 NSFetchedResultsController 启发的事件库,使用 Swift 编写。
FetchRequests 可以用于网络、数据库和文件查询的任意组合。当以类似 WebSocket 的东西作为后端,并且您期望数据实时更新时,它是最佳选择。
要开始使用,您需要创建一个 FetchRequest
来描述您的数据访问模式。FetchedResultsController
是访问您的数据的接口。对象按照以下启发式方法排序
您可以将相关值与您获取的实体关联起来。它将自动缓存这些关联值,直到控制器生命周期结束。如果发生内存压力事件,它将释放对这些对象的持有,允许它们被释放。
示例应用程序具有一个基于 UserDefaults 的存储机制。单元测试具有内存对象,并使用 NotificationCenter 事件。
如今,它严重依赖于 Obj-C 运行时以及键值观察 (Key-Value Observation)。应该有可能进一步移除这些限制,并且已经做出了一些努力来移除它们。
有两个 SwiftUI 属性包装器可供使用,FetchableRequest
和 SectionedFetchableRequest
。这些类似于 CoreData 的属性包装器。
控制器将在首次视图渲染时执行一次且仅一次 fetch 操作。在那之后,它依赖于实时更新事件。
示例
struct AllUsersView: View {
@FetchableRequest(
definition: FetchDefinition(request: User.fetchAll),
sortDescriptors: [
NSSortDescriptor(
key: #keyPath(User.name),
ascending: true,
selector: #selector(NSString.localizedStandardCompare)
),
]
)
private var members: FetchableResults<User>
// ...
}
对于更复杂的使用场景,您可能需要为您的视图编写初始化器,例如
struct MembersView: View {
private let fromID: EntityID
@FetchableRequest
private var members: FetchableResults<Membership>
func init(fromID: EntityID) {
self.fromID = fromID
_members = FetchableRequest(
definition: Membership.fetchDefinition(from: fromID, toEntityType: .user)
)
}
// ...
}
当通过 SPM 安装时,我们将使用 Swift Collections。否则我们将使用一个 效率较低的 OrderedSet。
通过将 Swift Package Manager 添加到您的 Package.swift
文件的 dependencies
值中来进行安装 Swift Package Manager。
dependencies: [
.package(url: "https://github.com/square/FetchRequests.git", from: "7.0.0")
]
通过在您的 Podfile
中指定以下内容,使用 CocoaPods 进行安装
pod 'FetchRequests', '~> 7.0'
通过在您的 Cartfile
中指定以下内容,使用 Carthage 进行安装
github "square/FetchRequests" ~> 7.0
如果您想为 FetchRequests 贡献代码,您可以通过在 GitHub 上 fork 存储库并发送 pull request 来完成。
当提交代码时,请尽一切努力遵循现有的约定和风格,以保持代码尽可能的可读性。
在您的代码被项目接受之前,您还必须签署 个人贡献者许可协议 (CLA)。
我们期望贡献者遵守 Square 开源行为准则。该文档的副本可在此处获取 here。
FetchRequests 在 MIT 许可证下发布。
MIT License
Copyright (c) 2019 Square Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.