假设我有这个代码
class Duck{
func walk() async {
//do something
print("walk start")
try? await Task.sleep(nanoseconds: UInt64(2e9))
print("walk end")
}
func quack() async {
//do something...
print("quack start")
try? await Task.sleep(nanoseconds: UInt64(2e9))
print("quack end")
}
func fly() async{
//do something
print("fly start")
try? await Task.sleep(nanoseconds: UInt64(2e9))
print("fly end")
}
}
let duck = Duck()
Task{
await duck.walk()
}
Task{
await duck.quack()
}
Task{
await duck.fly()
}
Run Code Online (Sandbox Code Playgroud)
这将打印
walk start
quack start
fly start
walk end
quack end
fly end
Run Code Online (Sandbox Code Playgroud)
这是我理解和期望的。但是如果我希望这 3 个 …
我有一个网络层,当前使用完成处理程序来传递操作完成的结果。
由于我支持多个 iOS 版本,因此我在应用程序内扩展网络层以提供对合并的支持。我想将其扩展到现在也支持异步/等待,但我很难理解如何以允许我取消请求的方式实现这一点。
基本实现如下所示;
protocol HTTPClientTask {
func cancel()
}
protocol HTTPClient {
typealias Result = Swift.Result<(data: Data, response: HTTPURLResponse), Error>
@discardableResult
func dispatch(_ request: URLRequest, completion: @escaping (Result) -> Void) -> HTTPClientTask
}
final class URLSessionHTTPClient: HTTPClient {
private let session: URLSession
init(session: URLSession) {
self.session = session
}
func dispatch(_ request: URLRequest, completion: @escaping (HTTPClient.Result) -> Void) -> HTTPClientTask {
let task = session.dataTask(with: request) { data, response, error in
completion(Result {
if let error = error …Run Code Online (Sandbox Code Playgroud) 我正在进行三个 api 调用,并希望 API1 应首先执行,完成后应执行 API2,然后执行 API3。我为此使用了操作队列,并添加了对操作的依赖性。我也尝试设置优先级,但没有按顺序获取 api 调用。帮我看看如何正确制作。
代码是这样的:
let op1 = Operation()
op1.completionBlock = {
self.APICall(urlString: self.url1)
}
op1.queuePriority = .veryHigh
let op2 = Operation()
op2.completionBlock = {
self.APICall(urlString: self.url2)
}
op2.queuePriority = .high
let op3 = Operation()
op3.completionBlock = {
self.APICall(urlString: self.url3)
}
op3.queuePriority = .normal
op2.addDependency(op1)
op3.addDependency(op2)
queue.addOperations([op1, op2, op3], waitUntilFinished: false)
Run Code Online (Sandbox Code Playgroud)
我将 API 调用方法放在 DispatchQueue.main.sync 中,如下所示:
func APICall(urlString: String) {
let headers: HTTPHeaders = [
"Accept": "text/html"
]
print(urlString)
DispatchQueue.main.sync {
Alamofire.request(urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!, method: .get, …Run Code Online (Sandbox Code Playgroud) 假设我有一个代码:
func someMethod() async {
... // processing 1
let someProperty = await someService.callSomeMethod()
... // processing 2
}
Run Code Online (Sandbox Code Playgroud)
从 WWDC 可以清楚地看出, await 之前和之后执行的代码可以在不同的线程上执行。
但是如果我想保证单线程执行怎么办?
很明显,如果我们谈论的是到主线程的强制上下文切换,那么用@MainActor属性指定方法就足够了,但是假设我想将自己与特定线程隔离,对我来说唯一重要的是,someMethod是在一个上下文中执行的吗?(处理1和处理2具有相同的上下文)
简而言之,swift中有一些类似的ConfigureAwait(c Sharp)?