2016-01-20 24 views
6

तो मेरा अपलोड अनुरोध विफल होने पर मैं पुनः प्रयास तर्क को कार्यान्वित करने के तरीके पर थोड़ा सा खो गया हूं।अनुरोध पर स्विफ्ट "पुनः प्रयास करें" तर्क

यहाँ मेरी कोड मैं कैसे यह

func startUploading(failure failure: (NSError) -> Void, success:() -> Void, progress: (Double) -> Void) { 
     DDLogDebug("JogUploader: Creating jog: \(self.jog)") 

     API.sharedInstance.createJog(self.jog, 
      failure: { error in 
       failure(error) 
      }, success: {_ in 
       success() 
     }) 
    } 
+0

चेक आउट इसी तरह के प्रश्न के लिए: http://stackoverflow.com/a/38720898/319805 – MNassar

उत्तर

14

यहाँ एक सामान्य समाधान है कि किसी भी async समारोह कोई पैरामीटर है, कॉलबैक छोड़कर करने के लिए लागू किया जा सकता है ऐसा करने के लिए पर कुछ मार्गदर्शन चाहते हैं। मैंने केवल success और failure कॉलबैक करके तर्क को सरल बना दिया, progress को जोड़ना मुश्किल नहीं होना चाहिए।

तो, यह सोचते हैं अपने कार्य इस तरह है:

func startUploading(success: Void -> Void, failure: NSError -> Void) { 
    DDLogDebug("JogUploader: Creating jog: \(self.jog)") 

    API.sharedInstance.createJog(self.jog, 
     failure: { error in 
      failure(error) 
     }, success: {_ in 
      success() 
    }) 
} 

मिलान यह इस प्रकार दिखाई देगा एक retry समारोह:

func retry(numberOfTimes: Int, task: (success: Void -> Void, failure: NSError -> Void) -> Void, success: Void -> Void, failure: NSError -> Void) { 
    task(success: success, 
     failure: { error in 
      // do we have retries left? if yes, call retry again 
      // if not, report error 
      if numberOfTimes > 1 { 
       retry(numberOfTimes - 1, task: task, success: success, failure: failure) 
      } else { 
       failure(error) 
      } 
     }) 
} 

और इस तरह कहा जा सकता है:

retry(3, task: startUploading, 
    success: { 
     print("Succeeded") 
    }, 
    failure: { err in 
     print("Failed: \(err)") 
}) 

उपर्युक्त startUploading कॉल तीन बार फिर से प्रयास करेगा विफल रहता है, अन्यथा पहली सफलता पर रोक देगा।

संपादित करें। कार्य करना है कि अन्य पैरामीटर है बस एक बंद में एम्बेड किया जा सकता:

func updateUsername(username: String, success: Void -> Void, failure: NSError -> Void) { 
    ... 
} 

retry(3, { success, failure in updateUsername(newUsername, success, failure) }, 
    success: { 
     print("Updated username") 
    }, 
    failure: { 
     print("Failed with error: \($0)") 
    } 
) 
+0

क्या मैं पूछ सकता हूं कि "इन" का अर्थ यहां "पुनः प्रयास करें (3, {सफलता, अद्यतन उपयोगकर्ता नाम में विफलता (नया उपयोगकर्ता नाम, सफलता, विफलता)} " धन्यवाद। – allenlinli

+2

@allenlinli 'इन' यहां एक बंद तर्क के बीच 'स्विफ्ट' के विभाजक का प्रतिनिधित्व करता है और यह शरीर – Cristik

2

यहाँ मैं भी सफलता ब्लॉक में एक सामान्य वस्तु जोड़ा स्विफ्ट 3. के लिए एक अद्यतन जवाब है, इसलिए यदि आप अपने नेटवर्क कॉल के बाद एक वस्तु बनाने के पूरा हो गया है आप इसे अंतिम बंद करने के साथ पास कर सकते हैं।

func retry<T>(_ attempts: Int, task: @escaping (_ success: @escaping (T) -> Void, _ failure: @escaping (Error) -> Void) -> Void, success: @escaping (T) -> Void, failure: @escaping (Error) -> Void) { 
task({ (obj) in 
    success(obj) 
}) { (error) in 
    print("Error retry left \(attempts)") 
    if attempts > 1 { 
    self.retry(attempts - 1, task: task, success: success, failure: failure) 
    } else { 
     failure(error) 
    } 
    } 
} 

यहाँ और आप इसे कैसे प्रयोग करेंगे यदि आप एक उपयोगकर्ता अद्यतन और अद्यतन जानकारी के साथ एक नया उपयोगकर्ता वस्तु वापस प्राप्त करना चाहता था है:: यहाँ फिर से प्रयास करें समारोह है मेरा उत्तर

NetworkManager.shared.retry(3, task: { updatedUser, failure in 
NetworkManager.shared.updateUser(user, success: updatedUser, error: failure) } 
, success: { (updatedUser) in 
    print(updatedUser.debugDescription) 
}) { (err) in 
    print(err) 
} 
+0

हाय जस्टिन, संभवतः इस फ़ंक्शन के साथ उपयोग किया जाता है: func dataTask (अनुरोध के साथ: URLRequest, completHandler: @escaping (डेटा ?, URLResponse ?, त्रुटि?) -> शून्य) -> URLSessionDataTask धन्यवाद – lveselovsky

संबंधित मुद्दे