2015-06-12 19 views
6

Vì vậy, tôi đã thử xử lý lỗi trong điều 2. Nhưng một điều mà tôi không chắc chắn là làm cách nào để nó hoạt động cho các chức năng gọi lại không đồng bộ. Giả sử tôi đang tải tài nguyên từ chương trình phụ trợ. Tôi đã xác định loại lỗi của mình như sau:Xử lý lỗi không đồng bộ trong nhanh chóng 02

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

Tôi định ném một trong những trường hợp này khi có sự cố. Đây là chức năng mà làm cho cuộc gọi mạng:

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

Nhưng ở đây biên dịch cho lỗi:

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

Từ đây rõ ràng là cùng loại đóng cửa được coi là một loại khác nhau khi nó được khai báo với throws .

Vì vậy, điều này hoạt động như thế nào sẽ hoạt động trong những trường hợp này?

Trả lời

0

Không có gì trong NSURLSession.h dường như ném ngoại lệ. Vì vậy, tôi tự hỏi nếu lớp đó đã được chuyển đổi để sử dụng chức năng mới này chưa.

3

Lỗi không thể được ném không đồng bộ vì hàm sẽ đã trả về khi lỗi xảy ra, bạn phải xử lý lỗi trong quá trình đóng bằng cách gọi lại một số hàm với thông số ErrorType để quyết định những gì bạn muốn làm nó. Ví dụ:

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 
    } 
} 
Các vấn đề liên quan