操作 3.4.1

Operations 3.4.1

测试测试过
语言 SwiftSwift
许可 MIT
发布上次发布2016年12月
SwiftSwift 版本2.3
SPM支持 SPM

Dan Thorpe 维护。



Build status

Operations

一个受 WWDC 2015 高级 NSOperations 会话启发的 Swift 框架。

资源 在哪里找到它
会话视频 developer.apple.com
参考文档 docs.danthorpe.me/operations
编程指南 operations.readme.io
示例项目 danthorpe/Examples

使用

编程指南更详细地介绍了如何使用此框架。但这里有一些关键细节。

OperationNSOperation 的子类。它是一个抽象类,应该被继承。

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)

这里的关键点是

  1. 继承 Operation
  2. 重写 execute 但不要调用 super.execute()
  3. 在开始任何工作之前检查 cancelled 属性。
  4. 如果没有取消,完成工作后始终调用 finish()。这可以是异步完成的。
  5. 将操作添加到 OperationQueue 实例中。

观察者

观察者附加到 Operation 上。当操作事件发生时,它们会收到回调。与 Apple 的示例代码不同,Operations 定义了四个观察者协议用于四个事件:did startdid canceldid produce operationdid finish。这些协议都有基于块的类型实现。例如,观察操作开始时

operation.addObserver(StartedObserver { op in 
    print("Lets go!")
})

框架还提供了 BackgroundObserverTimeoutObserverNetworkObserver

有关更多信息,请参阅 观察者 编程指南。

条件

条件附加到 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 容器、日历等)的授权。该协议提供了一种统一的方式来

  1. 使用 GetAuthorizationStatus 检查当前授权状态,
  2. 显式请求访问,使用 Authorize
  3. 以上两者作为名为 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 和他的团队。我的动机是想在自己的项目中采用这段代码,因此需要一个坚实基础且经过充分测试的框架,以便我能够将其集成。

其他 高级 NSOperations

其他开发者已经基于 Apple 的 WWDC 示例代码创建了项目。也请查看它们。

  1. PSOperations