使用异步函数和Reactive-Cocoa转换值数组

时间:2016-09-07 14:25:31

标签: objective-c swift reactive-cocoa

我有一个String数组,我想通过在每个值上调用异步函数来修改它。

我尝试了一些东西,但它只是创建RACSequence RACSignal而不是修改后的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)
})

1 个答案:

答案 0 :(得分:2)

正如您所说,您希望对数组中的每个字符串值执行异步函数。由于您执行异步操作,最终结果也将异步到达。获得RACSequence RACSignal之后,您需要等待每个信号为您提供值,然后将其全部收集到数组中。

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运算符,只要序列中的每个元素都为我提供了结果,它就会给我结果。一旦我得到所有结果,我就会在RACTuple内部subscribeNext方法获得一个数组。