2015-06-12 24 views
6

Così ho tentato di gestire gli errori in swift 2. Ma una cosa di cui non sono sicuro è come farlo funzionare per le funzioni di callback asincrone. Supponiamo che sto caricando una risorsa dal back-end. Ho definito il mio tipo di errore come il seguente:Gestione degli errori asincroni in swift 2

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

sto progettando di lanciare uno di questi casi, quando qualcosa di sbagliato. Ecco la funzione che fa la chiamata di rete:

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

Ma qui compilatore dà errore:

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

Da qui è evidente che lo stesso tipo di chiusura è considerato come un tipo diverso quando viene dichiarato con throws .

Quindi, come funziona questa cosa di fare-try-catch in queste situazioni?

risposta

0

Niente in NSURLSession.h sembra generare eccezioni. Quindi mi chiedo se quella classe è stata convertita per utilizzare ancora questa nuova funzionalità.

3

Un errore non può essere generato in modo asincrono perché la funzione sarà già stata restituita quando si verifica l'errore, è necessario gestire l'errore all'interno della chiusura richiamando alcune funzioni con un parametro ErrorType per decidere cosa si desidera fare con esso. Esempio:

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