Promise

这是一个轻量级且简单的 Swift Promise 实现。

使用方法

基本用法

let promise = Promise<Int, Never> { resolve, reject in
    resolve(10)
}

promise
    .map{ $0 * 10 } 
    .sink{ print($0) } // 100
    
let imageData = URLSession.shared.data(for: URL(string: "https://example.com/image.png))

imageData
    .sink{ print($0) } 

支持 Async/Await。

let dataPromsie = Promise<Int, Never> { resolve, reject in
	// download data
}

asyncHandler { await in
    let data = await | dataPromsie
	let image = await | UIImage.async(data: data)
              
	print(image.size)
}

操作符 (Operators)

操作符连接示例
let dataPromise: Promise<Data, Error> = ...

dataPromise
	.map{ 
        // 値の変換
    }
	.peek{
        // アクションの実行
    }
	.catch{ 
        // エラーのハンドリング
    }

使用 Async/Await

使用 asyncHandler 可以使用 Async/Await。

let dataPromise: Promise<Data, Error> = ...
let intPromise: Promise<Int, Never> = ...

let promise = asyncHandler { await in
	// promiseのawait
	let data = try await | dataPromise
	// FailureがNeverの場合はtryはいらない
	let int = await | intPromise
	
              
	return "Hello World" 
}

// 返り値をOutput、投げられた例外をFailureとするPromiseになる

队列 (Queue) 和 Promise

Promise 通常在执行它的队列中执行。

如果想在其他队列中执行,可以使用 async

Promise.async{ resolve, reject in
	// 重い処理
	...
	resolve(result)
}
.receive(on: .main) // メインスレッドで受け取る
.sink{ ... } // 実行処理

特殊操作符

Combine

组合 2 个或更多 Promise,如果全部成功,则以元组形式返回 Output。

let promise1 = Promise(...)
let promise2 = Promise(...)

promise1.combine(promise2)
	.sink{ ... }  // 実行処理
CombineCollection

组合 Promise 数组,如果全部成功,则以数组形式返回 Output。

let promises = [Promise](...)


promises.combine()
	.sink{ ... }  // 実行処理