Overdrive 0.3

Overdrive 0.3

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2017年4月
SwiftSwift版本3.0
SPM支持SPM

Said Sikira维护。



我们的应用程序不断进行工作。您对用户输入的反应越快,生成的输出越快,用户继续使用您的应用程序的可能性就越大。随着我们的应用程序变得更加复杂,需要完成的工作越来越多。您需要开始思考如何对工作进行分类和优化,如何使这项工作更高效、更优化,最终,更快。在大多数情况下,结果并不理想,因为您需要了解很多关于并发、多线程等方面的知识 - 这是一个非常复杂的领域。您在能够编写任何东西之前,需要了解所有的API特性。

Overdrive就是为了解决这个难题而创建的。它是一个框架,暴露了几个简单的概念,这些概念是基于复杂的系统框架构建的,这些框架使得多线程、并发以及最重要的速度提升成为可能。

let task = URLSessionTask(url: "https://api.swiftable.io")

task
  .retry(3)
  .onValue { json in
    print(json["message"])
  }.onError { error in
    print(error)
}

TaskQueue.background.add(task: task)

内容

我可以使用Overdrive做什么?

  • [x] 并发执行任务
  • [x] 默认利用多核系统
  • [x] 简易地将任务延迟到自定义线程或队列
  • [x] 确保多个任务按正确的顺序执行
  • [x] 表达任务执行的条件
  • [x] 强制可测试性
  • [x] 重试有错误的任务
  • [x] 默认编写线程安全代码

需求

  • Xcode 8.0+
  • Swift 3
  • 平台
    • iOS 8.0+
    • macOS 10.11+
    • tvOS 9.0+
    • watchOS 2.0+
    • Ubuntu

安装

Cocoa Pods

platform :ios, '8.0'
use_frameworks!

target 'Your App Target' do pod 'Overdrive', '~> 0.2' end

Swift Package Manager

import PackageDescription

let package = Package( name: Your Package Namepl-pds>, dependencies: [ .Package(url: https://github.com/arikis/Overdrive.gitpl-pds>, majorVersion: 0, minor: 2) ] )

手动安装

Overdrive 也可以通过拖动 Overdrive.xcodeproj 到项目中,并在项目设置中将 Overdrive.framework 添加到嵌入的库来手动安装。

使用方法

Overdrive 有两个主要类

工作流程

  1. 创建 Task<T> 的子类
  2. 重写 run() 方法并封装任何同步或异步操作
  3. 使用 finish(with:) 方法通过 value(T)error(Error) 完成
  4. 创建子类的实例
  5. 当你想要开始执行时,将其添加到 TaskQueue

示例:用于图片下载任务的 Task<UIImage> 子类

class GetLogoTask: Task<UIImage> {

override func run() { let logoURL = URL(string: https://swiftable.io/logo.pngpl-pds>)!

<span class="pl-k">do</span> {
  <span class="pl-k">let</span> logoData <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-c1">Data</span>(<span class="pl-c1">contentsOf</span>: logoURL)
  <span class="pl-k">let</span> image <span class="pl-k">=</span> <span class="pl-c1">UIImage</span>(<span class="pl-c1">data</span>: logoData)<span class="pl-k">!</span>
  <span class="pl-c1">finish</span>(<span class="pl-c1">with</span>: .<span class="pl-c1">value</span>(image)) <span class="pl-c"><span class="pl-c">//</span> Finish with image</span>

} catch { finish(with: .error(error)) // Finish with error if any } } }

要设置完成块,请使用 onValueonError 方法

let logoTask = GetLogoTask()

logoTask .onValue { logo in print(logo) // UIImage object }.onError { error in print(error) }

要执行任务,请将其添加到 TaskQueue 的实例中

let queue = TaskQueue()
queue.add(task: logoTask)

并发

TaskQueue 默认并发执行任务。最大并发操作数由当前系统条件定义。如果你想限制最大并发任务执行的数目,请使用 maxConcurrentTaskCount 属性。

let queue = TaskQueue()
queue.maxConcurrentTaskCount = 3

线程安全

所有任务属性默认情况下都是线程安全的,这意味着你可以从任何线程或队列访问它们,不必担心锁定和访问同步。

灵感来源

Overdrive 框架深受 Apple WWDC 视频中的演讲和代码的启发。

Overdrive 是指在电子吉他演奏中,当吉他放大器(管)开始产生过载、几乎失真的声音时使用的效果,这是因为增加了增益(主音量)设置。

长期计划

本节定义了 Overdrive 一些长期的计划。它们尚未安排实施或指定特定版本。

移除对 Foundation.Operation 的依赖

目前,Overdrive 利用 Foundation.OperationFoundation.OperationQueue 类进行并发和执行。虽然这些类提供了出色的功能,但它们仍然是其 Objective C 对应物(NSOperationNSOperationQueue)的重新编写。这意味着编写 Task<T> 需要很多覆盖和状态管理。

例如,任何任务子类都必须重写 run() 方法以定义执行点。如果没有重写该方法,队列将执行断言来通知应覆盖此方法。如果调用了 super.run(),也将发生同样情况。

将来,Overdrive 应仅使用 libdispatch 实现其功能。