2016-11-01 7 views
7

В Swift 3 был введен RecoverableError protocol, но здесь очень мало документации о том, как его использовать.Как использовать RecoverableError для повтора?

Это звучит как родной способ предложить функции повтора неудачных процессов, что может быть очень полезно. Каков пример того, как это можно использовать?

+2

Этот вопрос очень полезен..Не до сих пор никаких ответов..Чтобы за щедрость? –

+1

Я хорошая идея, эта тайна кажется жемчужиной. – TruMan1

+0

Если бы вы этого не сделали, я подумал, чтобы внести свой вклад :) –

ответ

2

Одна вещь, которую вы можете использовать RecoverableError - это приложение на основе документов для macOS.

  1. Создайте новый проект macOS> Cocoa, проверив «Создать приложение на основе документов».

  2. Определите свой собственный тип ошибки, соответствующий 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. Измените метод data(ofType:) в Document.swift, чтобы бросить эту ошибку.

    override func data(ofType typeName: String) throws -> Data { 
        //throw RecoverableError 
        throw MyError.documentSavingError 
    } 
    
  4. Вам нужно еще один трюк в текущем приложении документа на основе ...

    Создать новый быстрый код подкласса 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) 
        } 
    } 
    

    текущие документ на основе применения обертки выброшены RecoverableError в обычном NSError, так что, без этого, автоматически генерируются NSDocumentErrorRecoveryAttempter не работает хорошо.

    Не забудьте изменить Info.plist, чтобы назначить этот класс его основным классом.

  5. Создайте и запустите приложение, а затем, когда появится окно документа, Файл> Сохранить ... и нажмите «Сохранить» на листе сохранения.

    Вы можете найти, как ваш RecoverableError работает ...


Так, RecoverableError полезно, когда приложение уже реализует стандартную функцию восстановления, описанную в Error Handling Programming Guide. И его представление ясно говорит:

Важно: NSError класс доступен как на OS X и IOS. Однако API-интерфейсы и механизмы устранения ошибок и устранения ошибок доступны только в наборе приложений (OS X).

+0

Ницца, спасибо за начальный удар по этому поводу :) – TruMan1