使用异步函数和 Reactive-Cocoa 转换值数组
Transform an array of value with async function and Reactive-Cocoa
我有一个 String
的数组,我想通过对每个值调用一个异步函数来修改它。
我尝试了一些东西,但它只是创建了 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)
})
如您所说,您想对数组中的每个字符串值执行一个异步函数。由于您是异步执行的,因此最终结果也将异步到达。在获得 RACSequence
of 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
运算符,一旦序列中的每个元素向我提供结果,它就会给我结果。一旦我得到所有结果,我就会在 subscribeNext
方法中得到一个 RACTuple
,我可以用它制作一个数组。
我有一个 String
的数组,我想通过对每个值调用一个异步函数来修改它。
我尝试了一些东西,但它只是创建了 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)
})
如您所说,您想对数组中的每个字符串值执行一个异步函数。由于您是异步执行的,因此最终结果也将异步到达。在获得 RACSequence
of 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
运算符,一旦序列中的每个元素向我提供结果,它就会给我结果。一旦我得到所有结果,我就会在 subscribeNext
方法中得到一个 RACTuple
,我可以用它制作一个数组。