2016-07-10 12 views
1

Ich versuche, PromiseKit zu verwenden, und habe ein wenig Mühe, meinen Kopf darum zu wickeln. Ich habe eine Funktion, diePromiseKit - Zurück verschachteltes Versprechen

func lengthyOperation() -> Promise<TestObject> { 
    return Promise { fulfil, reject in 
    dispatch_async(GlobalUserInitiatedQueue) { 
     do { 
      let testObject = ... 
      fulfil(testObject) 
     } catch { 
      reject(error) 
     } 
    } 
    } 
} 

etwas tut, wie habe ich eine andere Funktion, die Ich mag würde dies rufen, und zurückzukehren und eine andere Versprechen

func lengthyOperation2() -> Promise<Test2Object> { 
    return Promise { fulfil, reject in 
     let test2Object = ... 
     if test2Object == nil { 
      lengthyOperation().then { testObject: TestObject in 
       let test2Object = doSomethingWithTestObject(testObject) 
       fulfil(test2Object) //Compiler error here 
      }.error { 
       reject(error) 
      } 
     } else { 
      fulfil(test2Object) 
     } 
    } 
} 

ich einen Compiler-Fehler sagen

Cannot convert return expression of type 'Void' (aka '()') to return type 'AnyPromise' 

Fragen:

  1. Benötige ich die Dispatch_async im Versprechen Anruf?
  2. Wie gehe ich vor, verschachtelte Versprechen wie diese aufzurufen und zurückzugeben?

Dank

Edit: einige der Pseudo-Code korrigieren

Antwort

0

Nur falls es jemand anderes hilft

  1. Aus der Dokumentation wird das Versprechen Anruf auf derselben gemacht Queue als die es heißt von. Wenn also Code im Hintergrund ausgeführt werden soll (in der ersten lengthOperation()), muss er in eine dispatch_async oder ähnliches eingebettet werden.
  2. scheinen ich die Dinge durch das folgende Muster

    gearbeitet haben zu bekommen
    func lengthyOperation2() -> Promise<Test2Object> { 
        return firstly { 
         return lengthyOperation() 
        }.then { (testObject: TestObject) -> Promise<Test2Object> in 
         let test2Object = doSomethingWithTestObject(testObject) 
         return Promise(test2Object) 
        } 
    } 
    
+0

Ich glaube nicht, Sie verwenden dispatch_async müssen. Vielleicht 'thenOn' oder' thenInBackground'. http://promisekit.org/dispatch-queues/ – Jon

+0

Jon - Danke. Aber wenn ich es nicht verpasse, sehe ich keine Möglichkeit, eigene Versprechen in einer Hintergrundwarteschlange zu erstellen. – georgemp

+0

Haben Sie die letzten drei Absätze in diesem Link gelesen? 'thenOn' verarbeitet den Hauptthread. 'thenInBackground' löst die Standard-GCD-Warteschlange aus. – Jon

Verwandte Themen