Ole*_*huk 6 ios nsurlsession swift
我的代码执行请求链接像A-> B-> C我正在使用URLSession
所有请求以正确的顺序和预期的行为完成.但我想知道如何优化这种链接,因为它看起来非常复杂而且不可重复使用.我正在寻找如何以更灵活的方式进行链接的建议.
我的代码:
URLSession.shared.dataTask(with: URLRequest(url: URL(string: "first")!)){ data , res , err in
let second = URLRequest(url: URL(string: "second")!)
URLSession.shared.dataTask(with: second){ data , res , err in
let third = URLRequest(url: URL(string: "second")!)
URLSession.shared.dataTask(with:third){ data , res , err in
}.resume()
}.resume()
}.resume()
Run Code Online (Sandbox Code Playgroud)
实际上你可以使用如下的OperationQueues来使用依赖项:
func operationQueueWithBlockandCancel(){
let mainQueue = OperationQueue.main
let operationBlock1 = BlockOperation()
let operationBlock2 = BlockOperation()
let operationBlock3 = BlockOperation()
operationBlock1.addExecutionBlock {
//Any task
}
operationBlock2.addExecutionBlock {
//Any task
}
operationBlock3.addExecutionBlock {
//Any task
}
//Add dependency as required
operationBlock3.addDependency(operationBlock2)
operationBlock2.addDependency(operationBlock1)
opQueue.addOperations([operationBlock2,operationBlock1,operationBlock3,], waitUntilFinished: false)
}
Run Code Online (Sandbox Code Playgroud)
正如@Paulw11 建议的:
PromiseKit + PMKFoundation
import PromiseKit
import PMKFoundation
let session = URLSession.shared
firstly {
session.dataTask(with: URLRequest(url: URL(string: "first")!))
} .then { data in
session.dataTask(with: URLRequest(url: URL(string: "second")!))
} .then { data in
session.dataTask(with: URLRequest(url: URL(string: "third")!))
} .then { data -> () in
// The data here is the data fro the third URL
} .catch { error in
// Any error in any step can be handled here
}
Run Code Online (Sandbox Code Playgroud)
通过 1 次(且仅 1 次)重试,您可以使用recover
. recover
与此类似,catch
只是预计then
可以重试前一个。但是,这不是循环并且仅执行一次。
func retry(url: URL, on error: Error) -> Promise<Data> {
guard error == MyError.retryError else { throw error }
// Retry the task if a retry-able error occurred.
return session.dataTask(with: URLRequest(url: url))
}
let url1 = URL(string: "first")!
let url2 = URL(string: "second")!
let url3 = URL(string: "third")!
let session = URLSession.shared
firstly {
session.dataTask(with: URLRequest(url: url1))
} .then { data in
session.dataTask(with: URLRequest(url: url2))
} .recover { error in
retry(url: url2, on: error)
} .then { data in
session.dataTask(with: URLRequest(url: url3))
} .recover { error in
retry(url: url3, on: error)
} .then { data -> () in
// The data here is the data fro the third URL
} .catch { error in
// Any error in any step can be handled here
}
Run Code Online (Sandbox Code Playgroud)
注意:为了在不指定返回类型和需要return
语句的情况下完成这项工作,我需要then
andrecover
恰好为 1 行。所以我创建了方法来进行处理。
归档时间: |
|
查看次数: |
1296 次 |
最近记录: |