相关疑难解决方法(0)

Swift 5.6 如何将异步任务放入队列

假设我有这个代码

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 个 …

concurrency asynchronous ios async-await swift

14
推荐指数
2
解决办法
1万
查看次数

取消异步/等待网络请求

我有一个网络层,当前使用完成处理程序来传递操作完成的结果。

由于我支持多个 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)

ios async-await swift urlsession

8
推荐指数
1
解决办法
8032
查看次数

即使设置了操作的优先级和依赖关系,操作队列也不会按顺序执行

我正在进行三个 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)

queue nsoperationqueue ios swift

5
推荐指数
1
解决办法
1892
查看次数

swift 中的ConfigureAwait 方法的模拟

假设我有一个代码:

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)?

ios async-await swift

2
推荐指数
1
解决办法
343
查看次数