RxSwift 简单后台任务示例

RxSwift Simple background task example

我有如下方法

public static func createAlbum(named: String, completion: (album: PHAssetCollection?) -> ()) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {

      }) { success, error in


                completion(album: album)
          }
       }
}

如何使用 RxSwift 执行后台任务

完整代码

https://gist.github.com/sazzadislam-dsi/d347909d284674c936e397ac423703cf

首先,您的函数必须 return 一个 Observable。

public static func rx_createAlbum(named: String)-> Observable<PHAssetCollection?>

其次,当出现错误时,你的函数会returnonError,当successtrue时,你的函数会returnonNext(album)onCompleted().

代码:

public static func rx_createAlbum(named: String)-> Observable<PHAssetCollection?> {
    return Observable.create { observer in

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {

            // ...

            }) { success, error in

                if error {
                    observer.onError(error)
                }
                else {
                    var album: PHAssetCollection?
                    if success {
                        let collectionFetchResult = PHAssetCollection.fetchAssetCollectionsWithLocalIdentifiers([placeholder?.localIdentifier ?? ""], options: nil)
                        album = collectionFetchResult.firstObject as? PHAssetCollection

                    }

                    observer.onNext(album)
                    observer.onCompleted()
                }

            }
        }

        return Disposables.create()

    }
}

@XFreire 答案是正确的,但是对于 Swift 3RxSwift 3.1.0 我将添加扩展名 PHAssetCollection:

extension Reactive where Base: PHPhotoLibrary {
    func createAlbum(named name: String) -> Observable<PHAssetCollection?> {
        return Observable.create { observer in
            self.base.performChanges({ 
                // ...
            }, completionHandler: { success, error in
                if success {
                    // Your success logic goes here
                    let album = PHAssetCollection()
                    // ...
                    observer.on(.next(album))
                    observer.on(.completed)
                } else if let error = error {
                    observer.on(.error(error))
                } else {
                    // Your error type
                    observer.on(.error(MyErrors.Unknown))
                }
            })

            return Disposables.create()
        }
    }
}

那么你可以使用这样的方法:

PHPhotoLibrary
    .shared().rx.createAlbum(named: "MyAlbum")
    .subscribe(onNext: { collection in
        // ...
    }, onError: { error in
        // ...
    })
    .addDisposableTo(disposeBag)