AOperation是对Operation和OperationQueue类的包装,为它们的使用提供了更多功能。
特性
- 支持声明性语法
- 可以使用Combine
- 易于使用
- 有助于编写更短、更模块化的代码
- 通过使用可重用操作和条件来防止代码重复
- 非常灵活
- 完全适应任何编程风格和架构
演示
TweetSeeker
这个演示是一个简单的应用,用于检索给定用户的推文。
当用户首次打开应用并输入用户名时,一个视图控制器会显示,请求注册。你应该注意到这个注册视图控制器不是作为视图控制器流程添加到应用中的,而是作为每个需要执行任务时执行授权的操作的条件来添加。这个条件将在操作添加到队列并准备执行时进行评估。条件评估流程如下。
每个条件可以有一个依赖操作,该操作将作为依赖项添加到入队操作中。依赖操作在条件评估之前执行和完成。对于此应用程序,AuthorizationCondition 将 CheckAuthorizationOperation 作为依赖操作。CheckAuthorizationOperation 检查授权密钥是否不可用,将 RegisterationViewController 显示给用户请求授权。授权完成操作后,然后条件评估授权密钥是否现在可用。如果是可用的,条件评估将成功,否则将失败。
因此,当应用程序获得授权后,用户可以搜索输入用户名的推文。
检索推文和更新视图的代码以两种方式进行编写
仅使用 AOperation
guard let username = sender.text, !username.isEmpty else { return }
// We used AOperation to handle process of
// fetching tweets
// If there is an enqueued fetchOperation we cancel it
// and creating a new fetch operation with the given new username
fetchOperation?.cancel()
// We set a delay before fetching tweets to make sure
// the given username is the one user wants to fetch
// tweets for.
fetchOperation =
DelayOperation<Void>(1)
.deliver(to: MapOperationBlock<Void, String> { _, finish in
finish(.success(username))
})
// Do not forget to use [weak self] if you referenced to self or any other reference type instance objects.
.deliver(to: FetchUserTimeLineOperation()).didFinish { [weak self] (result) in
guard let `self` = self else { return }
switch result {
case .success(let tweets):
self.searchTextField.textColor = tweets.count > 0 ? #colorLiteral(red: 0, green: 0.4784313725, blue: 1, alpha: 1) : .black
self.tweets = tweets
case .failure:
self.tweets = []
self.searchTextField.textColor = .black
return
}
}
// Always call this method at the end of a chain to enqueue chain of operations
.add(to: queue)
使用 Combine 的 AOperation
// Here we used a combination of two AOperation and Combine
// frameworks to fetching tweets
// Notice to shortness and readablity of this bunch of codes
cancellable =
$searchedText
.delay(for: 1, scheduler: RunLoop.main)
.compactMap({ (text) -> String? in
return text?.replacingOccurrences(of: " ", with: "")
})
.filter({!$0.isEmpty})
.removeDuplicates()
.deliver(to: FetchUserTimeLineOperation(), on: queue)
.catch({ _ in Just([])})
.assign(to: \.tweets, on: self)
审查和比较上述代码,以了解 AOperation 的强大功能,特别是与 Combine 一起使用时的功能。ReadMore
地震
第二个示例是一个简单的应用程序,显示了世界各地的近期地震。
当用户打开应用程序时,应用程序会检查 coredata 模型的可用性。如果是可用的,它将检索 coredata 数据并更新 UI,否则它将显示一个空白的视图列表。通过拉动到刷新 tableviewController,应用程序从互联网中检索新的地震数据并将其存储到 coredata 模型中,然后再次更新 UI。如果你点击每一行的地震,你会推进到一个新的视图控制器,该控制器显示有关地震的更多详细信息。例如,它会获取用户位置以显示地震与用户位置的距离。你还可以在此视图中分享地震信息。所有这些操作都是使用 AOperation 完成的。ReadMore
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它:
$ gem install cocoapods
要使用 CocoaPods 将 AOperation 集成到您的 Xcode 项目中,请在其 Podfile
中指定它。
platform :ios, '10.0'
use_frameworks!
target '<Your Target Name>' do
pod 'AOperation', '~> 2.0.0'
end
Swift Package Manager
Swift Package Manager 是一个用于自动化 Swift 代码分布的工具,集成了 swift
编译器。它处于早期开发阶段,但 Alamofire 支持在支持的平台使用它。
一旦您设置了您的 Swift 包,将 Alamofire 作为依赖项添加就像将它添加到您 Package.swift
的 dependencies
值一样简单。
dependencies: [
.package(url: "https://github.com/ssamadgh/AOperation.git", .upToNextMajor(from: "2.0.0"))
]
手动操作
如果您不希望使用上述依赖管理器中的任何一个,可以手动将 AOperation 集成到您的项目中。
内嵌框架
-
打开终端,使用
cd
命令进入您顶级项目目录,如果您项目未初始化为 Git 仓库,请运行以下命令:$ git init
-
通过运行以下命令将 AOperation 作为 git 子模块 添加:
$ git submodule add https://github.com/ssamadgh/AOperation.git
-
打开新的
AOperation
文件夹,并将AOperation.xcodeproj
拖动到应用 Xcode 项目的 Project Navigator 中。它应该位于应用蓝项目图标的下方。它是否在所有其他 Xcode 组之上或之下无关紧要。
-
在 Project Navigator 中选择
AOperation.xcodeproj
,并验证其部署目标与应用程序的部署目标一致。 -
接下来,在 Project Navigator 中(蓝项目图标)选择您的应用项目,导航到目标配置窗口,并在侧边栏的 "Targets" 标题下选择应用程序目标。
-
在窗口顶部的标签栏中,打开“通用”面板。
-
在“嵌入的二进制文件”部分下单击
+
按钮。 -
您将看到两个不同的
AOperation.xcodeproj
文件夹,每个文件夹中都有一个位于“Products”文件夹内的AOperation.framework
。您可以选择任何
Products
文件夹。 -
选择
AOperation.framework
。 -
这就完成了!
AOperation.framework
将自动添加为目标依赖项、链接框架和嵌入框架,在复制文件构建阶段,这是在模拟器和设备上构建所需的全部内容。
使用说明
使用 CheatSheet 快速回顾和训练 AOperation 的主要功能。否则,要深入理解 AOperation,请参考以下列表
- 基础
- AOperation 的声明式编程
- 将结果传递到另一个操作
- 使用 Combine 与 AOperation
- 如果操作失败,尝试重试操作
- 项目易于使用的几个操作
- 项目易于使用的几个条件
- 项目易于使用的几个观察者
致谢
AOperation 由 Seyed Samad Gholamzadeh 所有并维护。您可以在 Twitter 上关注我以获取项目的更新和发布信息:@ssamadgh。
许可证
AOperation 在 MIT 许可证下发布。有关详细信息,参见 LICENSE。