2015-06-12 14 views
6

Tak więc wypróbowałem obsługę błędów w szybkim 2. Ale jedną rzeczą, której nie jestem pewien, jest to, jak sprawić, by działała asynchroniczne funkcje wywołania zwrotnego. Załóżmy, że ładuję zasób z zaplecza. Mój typ błędu zdefiniowałem tak:Asynchroniczna obsługa błędów w swift 2

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

Mam zamiar rzucić jeden z tych przypadków, gdy coś jest nie tak. Oto funkcja, która sprawia, że ​​połączenia sieciowe:

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

Ale tu kompilator daje błąd:

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

Stąd oczywiste jest, że ten sam typ zamknięcia jest uważany za innego rodzaju, gdy jest ona zadeklarowana z throws .

Jak to działa w takich sytuacjach?

Odpowiedz

0

Nic w pliku NSURLSession.h nie wydaje wyjątków. Zastanawiam się więc, czy ta klasa została przekonwertowana na nową funkcjonalność.

3

Błąd nie może być wygenerowany asynchronicznie, ponieważ funkcja już powróciła po wystąpieniu błędu, musisz obsłużyć błąd w zamknięciu, oddzwaniając do jakiejś funkcji z parametrem ErrorType, aby zdecydować, co chcesz zrobić z to. Przykład:

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