将RxSwift Observable绑定到数组

时间:2017-04-13 09:08:09

标签: reactive-programming observable rx-swift

试用RxSwift并尝试转换我的网络电话。我似乎无法在视图中显示我的数据,因为我不确定如何将我的observable转换为我的视图可以使用的东西。以下是我的请求示例:

class SomeService {

    let provider = Provider()
    func getData() -> Observable<[Object]?> { // Returns json
        return provider
            .request(.getSomething())
            .debug()
            .mapArrayOptional(type: Object.self) 
            // Using Moya_Modelmapper map each item in the array
    }

}

在我的视图控制器中,我得到了数据:

 let data = Service.getData()
 print(data) ... <Swift.Optional<Swift.Array<MyApp.Item>>>

我试图订阅对序列的响应,但我不知道我是如何将它实际转换为类似于我可以在我的视图中使用的数组。

更新:已实施答案:

    func itemsObserver() {
        print("Time to print step 1") // This gets printed
        data
        .filter { $0 != nil }.map { $0! }
        .subscribe(
            onNext: { objects in
                print(objects as Any) 
                print("Step 2") // This does not get executed at all
            },
            onCompleted:{ objects in
                print(objects as Any) // This is ()
                print("Complete") // This gets printed
            }
            ).addDisposableTo(disposeBag)
    }
    itemsObserver()

控制台输出:

 Time to print step 1
 Service.swift:21 (getData()) -> subscribed
 Service.swift:21 (getData()) -> Event next(Status Code: 200, Data Length: 141)
 Service.swift:21 (getData()) -> Event completed
 Service.swift:21 (getData()) -> isDisposed
 ()
 Complete

1 个答案:

答案 0 :(得分:1)

更新

如果您的onNext阻止根本没有被调用,那么因为data从未产生任何内容。要么你的制作人没有制作任何对象,要么mapArrayOptional没有改变它们。

onCompleted块不接受任何参数,因此您拥有的objects变量无效/无效。

试试这个:

let data = service.getData()
data
    .filter { $0 != nil }.map { $0! } // this removes the optionality of the result.
    .subscribe(onNext: { objects in
        // in here `objects` will be an array of the objects that came through.
}).disposed(by: bag)