2015-06-12 10 views
6

में एसिंक्रोनस त्रुटि हैंडलिंग इसलिए मैंने स्विफ्ट 2 में त्रुटि प्रबंधन की कोशिश की। लेकिन एक बात जो मुझे यकीन नहीं है कि यह एसिंक्रोनस कॉलबैक फ़ंक्शंस के लिए कैसे काम करें। मान लीजिए कि मैं बैकएंड से संसाधन लोड कर रहा हूं। मैंने अपनी त्रुटि प्रकार को निम्नलिखित की तरह परिभाषित किया:स्विफ्ट 2

enum NetworkError: ErrorType { 
    case NoConnection 
    case InvalidJSON 
    case NoSuccessCode(code: Int) 
} 

मैं कुछ गलत होने पर इन मामलों में से किसी एक को फेंकने की योजना बना रहा हूं। यहाँ समारोह नेटवर्क कॉल बनाता है:

func loadRequest<T: Decodable>(request: NSURLRequest, callback:T -> Void) throws { 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(request) { data, response, error in 
     // Other code that parses json and at somewhere it throws 
     throw NetworkError.NoConnection 
    } 
} 

लेकिन यहाँ संकलक त्रुटि देता है:

Cannot invoke dataTaskWithRequest with an argument list of type (NSURLRequest, (_,_,_) throws) -> Void)

यहाँ से यह स्पष्ट है कि एक ही बंद प्रकार एक अलग प्रकार के रूप में जब यह throws साथ घोषित किया जाता है माना जाता है ।

तो इन परिस्थितियों में यह प्रयास करने वाली चीज़ कैसे काम करती है?

उत्तर

0

NSURLSession.h में कुछ भी अपवाद फेंकने लगता है। तो मुझे आश्चर्य है कि क्या इस वर्ग को अभी तक इस नई कार्यक्षमता का उपयोग करने के लिए परिवर्तित कर दिया गया है।

3

त्रुटि को असीमित रूप से फेंक नहीं दिया जा सकता है क्योंकि त्रुटि होने पर फ़ंक्शन पहले से ही वापस आ जाएगा, आपको ErrorType पैरामीटर के साथ कुछ फ़ंक्शन पर कॉल करके बंद करने के भीतर त्रुटि को संभालना होगा, यह तय करने के लिए कि आप क्या करना चाहते हैं यह। उदाहरण:

import Foundation 

enum NetworkError: ErrorType { 
    case NoConnection 
    case InvalidJSON 
    case NoSuccessCode(code: Int) 
} 


func getTask() -> NSURLSessionDataTask? { 
    let session = NSURLSession.sharedSession() 
    let urlRequest = NSURLRequest(URL: NSURL(string: "www.google.com")!) 
    return session.dataTaskWithRequest(urlRequest) { data, response, error in 
     if let error = error { 
      asyncError(error) 
     } else { 
      // Do your stuff while calling asyncError when an error occurs 
     } 
    } 
} 

func asyncError(error: ErrorType) { 
    switch error { 
    case NetworkError.NoConnection: 
     // Do something 
     break 
    default: 
     break 
    } 
} 
संबंधित मुद्दे