2015-11-01 110 views
0

我使用promisekit 3.0來幫助以乾淨的方式鏈接alamofire回調。目標是從網絡調用開始,並承諾返回一系列網址。PromiseKit 3.0:鏈接鏈接

然後,我正在尋找執行網絡調用盡可能多的這些網址,根據需要找到我正在尋找下一個鏈接。一旦找到這個鏈接,我可以將它傳遞給下一步。

這部分是我卡住的地方。

我可以選擇數組中的任意索引,但我無法弄清楚循環是如何保持它的,直到返回正確的信息。

我試圖從這個obj-c的例子中學習,但我無法在swift中工作。

https://stackoverflow.com/a/30693077/1079379

他是我做了什麼更實際的例子。

Network.sharedInstance.makeFirstPromise(.GET, url: NSURL(string: fullSourceLink)!) 
.then { (idArray) -> Promise<AnyObject> in 
    let ids = idArray as! [String] 

    //how do i do that in swift? (from the example SO answer) 
    //PMKPromise *p = [PMKPromise promiseWithValue: nil]; // create empty promise 

    //only thing i could do was feed it the first value 
    var p:Promise<AnyObject> = Network.sharedInstance.makePromiseRequestHostLink(.POST, id: ids[0]) 

    //var to hold my eventual promise value, doesn't really work unless i set it to something first 
    var goodValue:Promise<AnyObject> 

    for item in ids { 
     //use continue to offset the promise from before the loop started 
     continue 

     //hard part 
     p = p.then{ returnValue -> Promise<AnyObject> in 

      //need a way to check if what i get is what i wanted then we can break the loop and move on 
      if returnValue = "whatIwant" { 
       goodvalue = returnValue 
       break 
      //or else we try again with the next on the list 
      }else { 
       return Network.sharedInstance.makeLoopingPromise(.POST, id: item) 
      } 
     } 
    } 
    return goodValue 
}.then { (finalLink) -> Void in 
    //do stuck with finalLink 
} 

有人可以告訴我如何正確的結構,請嗎?

嵌套承諾如反模式,以避免?在那種情況下,最好的方法是什麼。

回答

1

我終於想通了你的帖子和你發佈的鏈接的組合。它的工作原理,但如果有人提出適當的解決方案,我會很高興。

func download(arrayOfObjects: [Object]) -> Promise<AnyObject> { 

     // This stopped the compiler from complaining 
     var promise : Promise<AnyObject> = Promise<AnyObject>("emptyPromise") 

     for object in arrayOfObjects { 
      promise = promise.then { _ in 
       return Promise { fulfill, reject in 
        Service.getData(stuff: object.stuff completion: { success, data in 
         if success { 
          print("Got the data") 
         } 

         fulfill(successful) 
        }) 
       } 
      } 
     } 

     return promise 
    } 

我不這樣做的唯一的事情表示在這個例子中保留接收到的數據,但我假設你可以做到這一點的結果數組你現在有。

+0

我不久前通過使用when(請參閱我的回答)計算出我的東西。不需要一個空的承諾,我不需要親自迭代並創建承諾對象。相反,我遍歷結果數組。 – stanley

0

找出我的特定問題的關鍵是使用「when」函數。它會一直持續,直到您輸入的所有電話都完成。這張地圖讓我更容易看到(並在腦海中思考)

}.then { (idArray) -> Void in 

     when(idArray.map({Network.sharedInstance.makePromiseRequest(.POST, params: ["thing":$0])})).then{ link -> Promise<String> in 
      return Promise { fulfill, reject in 
       let stringLink:[String] = link as! [String] 
       for entry in stringLink { 
        if entry != "" { 
         fulfill(entry) 
         break 
        } 
       } 
      } 
     }.then { 
     } 
}