AsyncKit 2.0.1

AsyncKit 2.0.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2016年10月
SPM支持SPM

Yuki MishimaYuki Mishima维护。



AsyncKit 2.0.1

  • Yuki Mishima

AsyncKit

由 JavaScript 模块 async 启发的异步代码实用工具。

AsyncKit 是

  • 使用 Swift 编写
  • 泛型
  • 代码更少

快速示例

let async = AsyncKit<String, NSError>()

async.parallel(
    [
        { done in done(.success("one")) },
        { done in done(.success("two")) }
    ]) { result in
        print(result) // -> success(["one", "two"])
        // the success array will equal ["one", "two"] even though
        // the second closure had a shorter timeout.
}

async.series(
    [
        { done in done(.success("one")) },
        { done in done(.success("two")) }
    ]) { result in
        print(result) // -> success(["one", "two"])
}

var count = 0
async.whilst({ return count < 2 },
    { done in
        count += 1
        done(.success(String(count)))
    }) { result in
        print(result) // -> success(Optional("2"))
}

async.waterfall("one",
    [
        // argument is "one"
        { argument, done in done(.success("two")) },
        // argument is "two"
        { argument, done in done(.success("three")) }
    ]) { result in
        print(result) // -> success("three")
}

用法

  1. 实例化 AsyncKit

    • 您需要指定成功对象类型和失败对象类型。
    • 例如

      let async = AsyncKit<String, NSError>()
  2. 准备过程闭包

    • 在闭包中,使用成功对象或失败对象调用传入的闭包。
    • 例如

      let process: AsyncKit<String, NSError>.Process = { done in
          request() { object, error in
              if error == nil {
                  done(.success(object))
              } else {
                  done(.failure(error))
              }
          }
      }
  3. 将过程闭包传递给 AsyncKit 函数并接收结果

    • 例如

      async.parallel([process1, process2]) { result in
          switch result {
          case .success(let objects):
              print(objects)
          case .failure(let error):
              print(error)
          }
      }


并行

func parallel(processes: [Process], completion: Result<[T], U> -> ())

并行运行进程,无需等待上一个进程完成。如果任何一个进程传递错误,则立即运行完成闭包,并带有错误的返回结果。一旦所有进程成功完成,完成闭包就会带有一个包含所有成功对象的数组运行。

参数

  • processes:一个数组,包含类型为 AsyncKit<T, U>.Process 的闭包。每个闭包都会接受一个闭包,它必须使用成功对象或失败对象执行此闭包。
  • completion:一个闭包,在所有进程都成功或任何进程失败后运行一次。此闭包接收一个包含所有成功对象或是一个失败对象的返回结果。

示例

AsyncKit<String, NSError>().parallel([
    { done in
        if arc4random_uniform(4) == 0 {
            done(.failure(NSError(domain: "AsyncKit", code: 0, userInfo: nil)))
        } else {
            done(.success("one"))
        }
    }, { done in
        if arc4random_uniform(4) == 0 {
            done(.failure(NSError(domain: "AsyncKit", code: 1, userInfo: nil)))
        } else {
            done(.success("two"))
        }
    }
    ]) { result in
        switch result {
        case .success(let objects):
            print(objects) // -> success(["one", "two"])
            // the success array will equal ["one", "two"] even though
            // the second closure had a shorter timeout.
        case .failure(let error):
            print(error)
        }
}


序列

func series(processes: [Process], completion: Result<[T], U> -> ())

按序列运行进程,每个进程将在上一个进程完成后运行。如果系列中的进程传递错误,则不会运行更多进程,并且完成闭包立即运行并带有错误的返回结果。否则,当进程成功完成时,完成闭包接收一个含有成功对象的数组作为成功的返回结果。

参数

  • processes:一个数组,包含类型为 AsyncKit<T, U>.Process 的闭包。每个闭包都会接受一个闭包,它必须使用成功对象或失败对象执行此闭包。
  • completion:一个闭包,在所有进程都成功或任何进程失败后运行一次。此闭包接收一个包含所有成功对象或是一个失败对象的返回结果。

示例

AsyncKit<String, NSError>().series([
    { done in
        if arc4random_uniform(4) == 0 {
            done(.failure(NSError(domain: "AsyncKit", code: 0, userInfo: nil)))
        } else {
            done(.success("one"))
        }
    }, { done in
        if arc4random_uniform(4) == 0 {
            done(.failure(NSError(domain: "AsyncKit", code: 1, userInfo: nil)))
        } else {
            done(.success("two"))
        }
    }
    ]) { result in
        switch result {
        case .success(let objects):
            print(objects) // -> success(["one", "two"])
        case .failure(let error):
            print(error)
        }
}


while

func whilst(test: () -> Bool, _ process: Process, completion: Result<T?, U> -> ())

反复调用 process,直到 test 返回 true。当停止或发生错误时调用完成。

参数

  • test:在每次执行 process 之前进行的一个测试。
  • process:一个闭包,每次测试通过时都会被调用。该闭包被传递一个闭包,该闭包必须在完成并带有结果时调用。
  • completion:一个闭包,在测试闭包失败并且 process 的重复执行停止后运行。该闭包得到一个包含可选的成功对象(传递给最终 process 的闭包)或错误对象的的结果。

示例

var count = 0
AsyncKit<String, NSError>().whilst({
        return count < 2
    },
    { done in
        count += 1
        if arc4random_uniform(4) == 0 {
            done(.failure(NSError(domain: "AsyncKit", code: count, userInfo: nil)))
        } else {
            done(.success(String(count)))
        }
    }) { result in
        switch result {
        case .success(let object):
            print(object) // -> Optional("2")
        case .failure(let error):
            print(error)
        }
}


waterfall

func waterfall(argument: T, _ processes: [ProcessWithArgument], completion: Result<T, U> -> ())

按顺序运行 processes 的 Tasks 数组,每个执行完成将结果传递到下一个。但是,如果任何一个 process 传递错误,则不会执行下一个 process,并且立即以错误运行 completion 闭包。

参数

  • argument:一个第一个参数。
  • process:一个包含类型为 AsyncKit<T, U>.ProcessWithArgument 的闭包数组的数组。每个闭包都接受一个参数和一个闭包,该闭包必须在完成时(无论是成功还是失败)被调用。成功对象将是下一个 process 的参数。
  • completion:一个闭包,一旦所有 process 成功或者任何一个 process 失败后就运行。该闭包得到一个包含最终 process 的成功对象或错误对象的结果。

示例

AsyncKit<String, NSError>().waterfall("one",
    [
        // argument is "one"
        { argument, done in
            if arc4random_uniform(4) == 0 {
                done(.failure(NSError(domain: "AsyncKit", code: 0, userInfo: nil)))
            } else {
                done(.success("two"))
            }
        },
        // argument is "two"
        { argument, done in
            if arc4random_uniform(4) == 0 {
                done(.failure(NSError(domain: "AsyncKit", code: 1, userInfo: nil)))
            } else {
                done(.success("three"))
            }
        }
    ]) { result in
        switch result {
        case .success(let object):
            print(object)
        case .failure(let error):
            print(error)
        }
}


需求

Swift 3.0

作者

Yuki Mishima,[email protected]

许可

AsyncKit 可在 MIT 许可下使用。有关更多信息,请参阅 LICENSE 文件。