0

我对我的 Firebase 数据库有几个请求,这些请求包含在这样的 signalProducer 中:

static func parseOne(snap: FIRDataSnapshot) -> SignalProducer<FUser, NSError> {
    return SignalProducer { subscriber, disposable in
        let ref = FIRDatabase.database().reference()
        let objRef = ref.child(FUser.URL + "/" + snap.key)
        objRef.observeSingleEventOfType(.Value, withBlock: { (snap) in
            let user = FUser(snap: snap)
            subscriber.sendNext(user)
            subscriber.sendCompleted()
        })
    }
}

我希望能够同时调用其中的几个,然后等待所有人完成后再做某事。

Reactivecocoa 有办法解决这个问题吗?还是我与 signalProducer 的方向错误?

4

1 回答 1

0

这是 reactivecocoa 擅长的事情——并且有一个内置的运算符combineLatest可以完全按照您的要求进行操作。例如 parseMany 函数看起来像这样:

func parseMany(snaps: [FIRDataSnapShot]) -> SignalProducer<[FUser], NSError> {
    let parseOneSignals = snaps.map(parseOne) //array of FUser signal producers
    return combineLatest(parseOneSignals) //signal producer that sends .Next(arrayOfAllFUsers) when all the parseOneSignals have sent their .Next(singleFUser)
}
于 2016-10-10T22:27:51.610 回答