2016-11-01 6 views
7

In Swift 3 wurde die RecoverableError protocol eingeführt, aber hier ist nur sehr wenig Dokumentation darüber, wie man das benutzt.Wie RecoverableError zu wiederholen?

Das klingt wie eine native Möglichkeit, Wiederholungsfunktionalität für fehlgeschlagene Prozesse anzubieten, was sehr nützlich sein könnte. Was ist ein Beispiel dafür, wie dies genutzt werden kann?

+2

Diese Frage ist ziemlich nützlich..Aber keine Antworten bis jetzt..Thinking für Kopfgeld? –

+1

Ya gute Idee, dieses Geheimnis scheint wie ein Juwel. – TruMan1

+0

Wenn du es nicht getan hättest, dachte ich daran, einen Beitrag zu leisten :) –

Antwort

2

Eine Sache, die Sie verwenden können RecoverableError ist Document-basierte Anwendung für MacOS.

  1. Erstellen Sie ein neues Projekt, macOS> Cocoa, und prüfen Sie "Dokumentbasierte Anwendung erstellen".

  2. Definieren Sie Ihren eigenen Fehlertyp, der RecoverableError entspricht.

    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. Ändern der data(ofType:) Methode in Document.swift den Fehler zu werfen.

    override func data(ofType typeName: String) throws -> Data { 
        //throw RecoverableError 
        throw MyError.documentSavingError 
    } 
    
  4. Sie benötigen einen weiteren Trick im aktuellen Dokument-basierte Anwendung ...

    einen neuen SWIFT-Code erstellen NSApplication Unterklasse.

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

    aktuell Dokument-basierte Anwendung Wraps RecoverableError in einer üblichen NSError geworfen, so, ohne dass dies, NSDocumentErrorRecoveryAttempter automatisch generierte gut funktioniert nicht.

    Vergessen Sie nicht, die Info.plist zu ändern, um diese Klasse als ihre Hauptklasse zu bezeichnen.

  5. Erstellen Sie die App und führen Sie sie aus. Wenn ein Dokumentfenster angezeigt wird, klicken Sie auf Datei> Speichern ..., und klicken Sie im Sicherungsblatt auf Speichern.

    Sie können feststellen, wie Ihr RecoverableError arbeitet ...


So ist RecoverableError nützlich, wenn Sie Ihre App bereits die Standard-Recovery-Funktion in der Error Handling Programming Guide beschrieben implementiert. Und seine Einführung sagt klar:

Wichtige: Die NSError Klasse sowohl auf OS X und iOS verfügbar ist. Die Fehlerantworter- und Fehlerbehebungs-APIs und -Mechanismen sind jedoch nur im Application Kit (OS X) verfügbar.

+0

Schön, vielen Dank für den Start hierauf :) – TruMan1

Verwandte Themen