Retry in Swift
//
// ViewController.swift
// PlayRetry
//
// Created by Li Lin on 18/11/16.
// Copyright © 2016 Li Lin. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
retry(for: 3, after: 10, task: { self.updateProfile(firstName: "firstName", lastName:"lastName") },
success: { response, data in
print("Succeeded")
print("data: \(data)")
},
failure: { response, err in
print("Failed: \(err)")
}
)
}
// func startUploading(success: @escaping (URLResponse?,Data) -> (), failure: @escaping (URLResponse?, Error?) -> ()) {
// URLSession.shared.dataTask(with: URL(string: "http://www.apple.com")!, completionHandler: { data, response, error in
// guard error == nil, let data = data else {
// failure(response, error)
// return
// }
// success(response,data)
// }).resume()
// }
typealias Async = (_ success: @escaping (URLResponse?,Data) -> (), _ failure: @escaping (URLResponse?, Error?) -> ()) -> ()
func updateProfile(firstName: String, lastName: String) -> Async {
return {success, failure in
URLSession.shared.dataTask(with: URL(string: "http://www.apple.com")!, completionHandler: {
data, response, error in
guard error == nil, let data = data else {
failure(response, error)
return
}
success(response,data)
}).resume()
}
}
func retry(for attemp: Int, after seconds: Int, task: @escaping () -> Async, success: @escaping (URLResponse?,Data) -> (), failure: @escaping (URLResponse?, Error?) -> ()) {
weak var wSelf = self
task()(success, { response, error in
if attemp <= 0 {
failure(response,error)
return
}
print("retry for attemp \(attemp)")
wSelf?.retry(for: attemp - 1, after: seconds , task: task, success: success, failure: failure)
})
}
}