2016-09-07 66 views
1

我有一個String的數組,我想通過調用每個值的異步函數對其進行修改。使用異步函數和Reactive-Cocoa轉換數組數組

我試過的東西,但它只是創造RACSignal一個RACSequence,而不是數組修改String

func modifyValueAsynchronously(inputValue: String, completion: (String -> Void)) -> RACSignal { 
    return RACSignal.createSignal() { subscriber in 
     doAServerCall(inputValue) { outputValue in 
      subscriber.sendNext(outputValue) 
     } 
    } 
} 

let value: NSArray = ["a", "b"] 

let result = value.rac_sequence.map({ value in 
    return self.doRequest(value as! String) 
}) 

回答

2

正如你所說,要在每個陣列的字符串值執行異步功能。由於你做異步的事實,最終的結果也會異步。在得到RACSequenceRACSignal之後,您要等到每個信號爲您提供值並將其收集到數組中。

let transformation = { (input: String) -> RACSignal in 
     return RACSignal.createSignal { subscriber in 
      subscriber.sendNext(input + "a") 
      return nil 
     } 
    } 

    let array: NSArray = ["a", "b", "c", "d"] 

    let sequence = array.rac_sequence.map({ (element) in 
     return transformation(element as! String) 
    }) 
    RACSignal.combineLatest(sequence).subscribeNext { (element) in 
     let array = (element as! RACTuple).allObjects() 
     print("Elements from array \(array) \n") 
    } 

讓我們看看這個例子。轉換閉包會爲每個字符串異步添加一個'a'字母。在創建一個序列之後,我添加combineLatest運算符,它將在序列中的每個元素都提供給我結果時立即給出結果。只要我得到所有結果,我就會在subscribeNext方法中得到一個RACTuple,並且我可以製作一個數組。