测试测试过 | ✓ |
语语言 | SwiftSwift |
许可 | MIT |
发布上次发布 | 2016年12月 |
SwiftSwift 版本 | 2.3 |
SPM支持 SPM | ✓ |
由 Dan Thorpe 维护。
一个受 WWDC 2015 高级 NSOperations 会话启发的 Swift 框架。
资源 | 在哪里找到它 |
---|---|
会话视频 | developer.apple.com |
参考文档 | docs.danthorpe.me/operations |
编程指南 | operations.readme.io |
示例项目 | danthorpe/Examples |
编程指南更详细地介绍了如何使用此框架。但这里有一些关键细节。
Operation
是 NSOperation
的子类。它是一个抽象类,应该被继承。
import Operations
class MyFirstOperation: Operation {
override func execute() {
guard !cancelled else { return }
print("Hello World")
finish()
}
}
let queue = OperationQueue()
let myOperation = MyFirstOperation()
queue.addOperation(myOperation)
这里的关键点是
Operation
execute
但不要调用 super.execute()
cancelled
属性。finish()
。这可以是异步完成的。OperationQueue
实例中。观察者附加到 Operation
上。当操作事件发生时,它们会收到回调。与 Apple 的示例代码不同,Operations 定义了四个观察者协议用于四个事件:did start、did cancel、did produce operation 和 did finish。这些协议都有基于块的类型实现。例如,观察操作开始时
operation.addObserver(StartedObserver { op in
print("Lets go!")
})
框架还提供了 BackgroundObserver
、TimeoutObserver
和 NetworkObserver
。
有关更多信息,请参阅 观察者 编程指南。
条件附加到 Operation
上。在操作准备执行之前,它会异步 评估 所有的条件。如果有任何条件失败,操作将以错误完成而不是执行。例如
operation.addCondition(BlockCondition {
// operation will finish with an error if this is false
return trueOrFalse
}
条件可以相互排斥。这与锁定阻止执行具有相同排除的其他操作类似。
该框架提供了以下条件:`AuthorizedFor`、`BlockCondition`、`MutuallyExclusive`、`NegatedCondition`、`NoFailedDependenciesCondition`、`SilentCondition`、`ReachabilityCondition`、`RemoteNotificationCondition`、`UserConfirmationCondition` 和 `UserNotificationCondition`。
有关更多信息,请参阅有关 条件 的编程指南。
CapabilityType
是一种协议,表示应用程序访问设备或用户账户功能(例如位置服务、Cloud Kit 容器、日历等)的授权。该协议提供了一种统一的方式来
GetAuthorizationStatus
检查当前授权状态,Authorize
AuthorizedFor
的条件。例如
class ReminderOperation: Operation {
override init() {
super.init()
name = "Reminder Operation"
addCondition(AuthorizedFor(Capability.Calendar(.Reminder)))
}
override func execute() {
// do something with EventKit here
finish()
}
}
框架提供了以下功能:`Capability.Calendar`、`Capability.CloudKit`、`Capability.Health`、`Capability.Location`、`Capability.Passbook` 和 `Capability.Photos`。
有关更多信息,请参阅有关 功能 的编程指南。
Operation
有自己的内部日志功能,通过 log
属性公开。
class LogExample: Operation {
override func execute() {
log.info("Hello World!")
finish()
}
}
有关更多信息,请参阅有关 日志记录 和 支持第三方日志框架 的编程指南。
状态(或如果你愿意,数据)可以在操作之间无缝过渡。一个产生 结果 的操作可以符合 ResultOperationType
,并通过其 result
属性公开状态。一个消耗状态的操作可以符合 AutomaticInjectionOperationType
,并通过其 requirement
属性设置其 requirement。给定符合这些协议,操作可以串联起来。
let getLocation = UserLocationOperation()
let processLocation = ProcessUserLocation()
processLocation.injectResultFromDependency(getLocation)
queue.addOperations(getLocation, processLocation)
有关更多信息,请参阅有关 注入结果 的编程指南。
请参阅编程指南中的详细 安装说明。
我想强调,此代码深受 Apple 的影响。我绝对没有试图为这种架构招收任何形式的称赞——这应归功于 Dave DeLong 和他的团队。我的动机是想在自己的项目中采用这段代码,因此需要一个坚实基础且经过充分测试的框架,以便我能够将其集成。
其他开发者已经基于 Apple 的 WWDC 示例代码创建了项目。也请查看它们。