2016-11-01 14 views
7

Trong Swift 3, các RecoverableError protocol đã được giới thiệu, nhưng đây là tài liệu rất ít về cách sử dụng này.Cách sử dụng RecoverableError để thử lại?

Điều này nghe có vẻ giống như một cách tự nhiên để cung cấp chức năng thử lại cho các quy trình không thành công, điều này có thể khá hữu ích. Một ví dụ về cách thức này có thể được sử dụng là gì?

+2

Câu hỏi này khá hữu ích..Không có câu trả lời cho đến bây giờ..Nhận xét về tiền thưởng? –

+1

Ý tưởng hay, bí ẩn này có vẻ giống như một viên ngọc. – TruMan1

+0

Nếu bạn không có, tôi đã suy nghĩ để đóng góp :) –

Trả lời

2

Một điều bạn có thể sử dụng RecoverableError là ứng dụng dựa trên tài liệu cho macOS.

  1. Tạo dự án mới, macOS> Ca cao, kiểm tra "Tạo ứng dụng dựa trên tài liệu".

  2. Xác định loại Lỗi của riêng bạn tuân theo RecoverableError.

    enum MyError { 
        case documentSavingError 
        //... 
    } 
    extension MyError: RecoverableError { 
        var recoveryOptions: [String] { 
         return [ 
          "Retry", "Ignore" 
         ] 
        } 
    
        func attemptRecovery(optionIndex recoveryOptionIndex: Int) -> Bool { 
         if recoveryOptionIndex == 0 {//for "Retry" 
          var result = false 
          switch self { 
          case .documentSavingError: 
           //Attempt "Retry" recovery for the failed operation, and return the result 
           //... 
           print("assume recovery attempt successfully finished...") 
           result = true 
          //... 
          } 
          return result 
         } else if recoveryOptionIndex == 1 {//for "Ignore" 
          return true 
         } 
         fatalError("something wrong...") 
        } 
    } 
    
  3. Sửa đổi phương thức data(ofType:) trong Document.swift để báo lỗi.

    override func data(ofType typeName: String) throws -> Data { 
        //throw RecoverableError 
        throw MyError.documentSavingError 
    } 
    
  4. Bạn cần thêm một số mẹo trong việc áp dụng tài liệu dựa trên hiện tại ...

    Tạo một mã nhanh chóng mới để phân lớp NSApplication.

    import AppKit 
    
    @objc(Application) 
    class Application: NSApplication { 
        override func presentError(_ error: Error, modalFor window: NSWindow, delegate: Any?, didPresent didPresentSelector: Selector?, contextInfo: UnsafeMutableRawPointer?) { 
         //print(error) 
         let underlyingError = (error as NSError).userInfo[NSUnderlyingErrorKey] as? Error ?? error 
         //print(underlyingError) 
         super.presentError(underlyingError, modalFor: window, delegate: delegate, didPresent: didPresentSelector, contextInfo: contextInfo) 
        } 
    } 
    

    Các liệu pháp quấn ứng dụng Document dựa trên hiện ném RecoverableError trong một thông thường NSError, vì vậy, không có điều này, tự động tạo ra NSDocumentErrorRecoveryAttempter không hoạt động tốt.

    Đừng quên sửa đổi Info.plist để chỉ định lớp này làm lớp Chính.

  5. Xây dựng và chạy ứng dụng, sau đó khi cửa sổ tài liệu được trình bày, Tệp> Lưu ... và nhấp vào Lưu trong bảng lưu.

    Bạn có thể tìm cách RecoverableError bạn đang làm việc ...


Vì vậy, RecoverableError rất hữu ích khi ứng dụng của bạn đã thực hiện các tính năng phục hồi chuẩn được mô tả trong Error Handling Programming Guide. Và giới thiệu nó nói rõ:

quan trọng: Lớp NSError có sẵn trên cả OS X và iOS. Tuy nhiên, các API và các cơ chế trả lời lỗi và trả lời lỗi và các cơ chế chỉ khả dụng trong Bộ Ứng dụng (OS X).

+0

Tốt đẹp, cảm ơn cho người đứng đầu bắt đầu này :) – TruMan1

Các vấn đề liên quan