New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Cancelation Story #5
Comments
In general case, you'd need some sort of a custom cancellation token at this point, depending on what you plan to accomplish. For network requests specifically, you may find class Fetcher {
var task: URLSessionDataTask?
func fetch(url: URL) -> Promise<(Data?, URLResponse?)> {
cancel()
return wrap { (handler: @escaping (Data?, URLResponse?, Error?) -> Void) in
self.task = URLSession.shared.dataTask(with: url, completionHandler: handler)
self.task?.resume()
}
}
func cancel() {
task?.cancel()
}
}
let fetcher = Fetcher()
fetcher.fetch(url: URL(string: "https://google.com")!).then { _, response in
print(response)
}.catch { error in
print(error)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
fetcher.cancel()
} |
Thanks for the example. I'd love to see this folded into your docs. |
@shoumikhin This will only cancel previous request if you make a new one, right? |
@shmidt Some examples on how you'd like to cancel the promise are highly appreciated. Keep in mind, one can always invoke BTW, just noticed the above code can be simplified with func fetch(url: URL) -> Promise<(Data?, URLResponse?)> {
cancel()
return wrap { (handler: @escaping (Data?, URLResponse?, Error?) -> Void) in
self.task = URLSession.shared.dataTask(with: url, completionHandler: handler)
self.task?.resume()
}
} |
@shoumikhin Thanks for the fast reply.
where |
current code: public static func download(token: Cancellation.Token? = nil) -> Promise<Data> {
return Promise { fulfill, reject in
// simulate download ..., typically data will come in chunks and will be cached ...
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
if let token = token, token.isCancellationRequested {
return reject(Error.cancel)
} else {
return fulfill(Data())
}
})
}
} let source = Cancellation.Source()
let promise = download(token: source.token)
.then({ (data) in
print("data -----> ", data)
})
.catch({ (error) in
print("ERROR -> ", error)
})
DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
// simulate user pressed stop downloading ...
source.cancel()
}) proposal: implement something like this: https://github.com/vadymmarkov/When#fail Other suggestions ? |
How does cancelation work for network requests, e.g.?
The text was updated successfully, but these errors were encountered: