allenlinli
11/18/2016 - 3:34 AM

Retry in Swift

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