iOS使用RxSwift跟踪异步网络呼叫何时完成

时间:2017-04-06 06:33:51

标签: ios rx-swift

我正在努力将RxSwift集成到我的项目中

我编写了一个异步网络请求,其结果是在回调闭包上传递。

这是我的网络功能

let webpack  = require('webpack'),
    path     = require('path'),
    fs       = require('fs'),
    manifest = require('./manifest.json'),
    {resolve, join} = path,
    env = process.env.NODE_ENV;

let plugins = [
    new webpack.BannerPlugin(
        fs
          .readFileSync('./LICENSE')
          .toString('utf-8')),
    new webpack.DllReferencePlugin({context: __dirname, manifest})
];

// if (env === 'pro') {

// } else {
//  plugins.push()
// }

let config = {
        // context: resolve(__dirname, 'src'), 
    entry: {
        app: [
            './src/jsx/app.jsx',
            './src/style/app.less'
        ]
    },

    output: {
        path: resolve(__dirname, 'dist'),
        filename: 'bundle.js'
    },

    devtool: false,

    module: {
        loaders: [{
            test: /\.(js|jsx)$/,
            exclude: /node_modules/,
            loader: 'babel-loader',     
            query: {
                presets: [
                    'stage-2',
                    'es2015',
                    'react'
                ]
            }
        },{
            test: /\.less$/,
            loader: 'style!css!autoprefixer!less'
        }]
    },

    resolve: {
        extensions: ['', '.js', '.jsx']
    },

    plugins
}

module.exports = config;

我的问题是我们如何注册观察网络调用结果的func discoverMovies(for url: String, withPage page: Int, success: @escaping(Bool)->()) { let requestUrl = "\(url)&page=\(page)" requestGETURL(requestUrl, success: { (json) in self.createOrUpdateMoviesList(from: json) success(true) }) { (error) in print("Could not download due to \(error)") success(false) } } (成功是真还是假),以便我们可以根据结果编写额外的句柄(附加代码只会执行网络完成后。)

1 个答案:

答案 0 :(得分:3)

我会将你的函数包装成Rx函数:

func discoverMovies(for url: String, withPage page: Int) -> Observable<MoviesList>{
    Observable.create{ observer in 

        let requestUrl = "\(url)&page=\(page)"

        self.requestGETURL(requestUrl, success: { (json) in

            // your createOrUpdateMoviesList(from:) function returns a MoviesList
            let moviesList = self.createOrUpdateMoviesList(from: json)   
            observer.onNext(moviesList)
            observer.onCompleted()

        }) { (error) in
            print("Could not download due to \(error)")
            observer.onError(error)
        }

        return Disposables.create()
    }
}

func otherFunction(withMovies list: MoviesList) -> Observable<Something> {
    // blah blah blah...
}

现在,您可以使用flatMap运算符链接Rx函数:

discoverMovies(for url: "the url", withPage page: 1)
    .flatMap{ list in 
        otherFunction(withMovies: list)  
    }
    .subscribe(onNext:{ something in
        // ...
    },
     onError: { error in
        // manage errors
    })

如果otherFunction()取得成功,您可以确定只会调用discoverMovies()