[iOS]-RxSWIFT入門(1)


学習RxSWIFT

同期ですか、非同期ですか。

  • GCD : DispatchQueue
  • 同期と非同期.これはアプリケーションプログラミングに不可欠な内容です.
    アップル、GCD:Grand Central Dispatch
    DispatchQueueとも呼ばれ、非同期方式を実現しています.
    このブログから学んだことをもとに、簡単に説明します
    SyncとAsyncにはパラレルとシリアルがあります.
    Concurrentは、メインスレッド内の複数のタスクを複数のThreadに割り当てて処理します.
    シリアルは、プライマリ・スレッド内の複数のタスクを1つのスレッドに割り当てて処理します.
    すなわち、シリアル方式が複数のThreadに用いられると、Concurrentとなる.
    SyncとAsyncを区別するには、次の手順に従います.
    Url(https://appshawn.com)が受信した画像をUIImageViewに配置すると仮定する.
    同期コード(画像ビューに直接配置すればよい)書くと、
    Urlから画像の0を受信します.x秒でThreadは止まった.
    何の機能もありません.
    「DispatchQueue.global.async」(DispatchQueue.async)コードを使用します.
    Urlから受信した画像のTaskは別のスレッドに割り当てられるので、MainThreadは他のTaskを処理することができる.
    GlobalDispatchQueueに盲目的にコードを書き込むと、UIImageViewがmainスレッドで処理しなければならないというエラーメッセージが表示されることに注意してください.(Threadに関するエラーは紫色のエラー情報を表示します)UIdiewまたはUIに関するエラーは必ずmain Threadとして処理してください.
    今回アプリストアに登録した入社申請

    入社後、同期・非同期方式は正しく設計・製作されていない.
    しかし、KingFisherというライブラリを使いました.
    後で他のアプリケーションを作成するときはsyncとasyncを考慮して設計します.(怒っているようです)

    PromiseKit


    入社したマイクロアプリケーションはKingFisherを使用しています.
    今回はPromiseKitについて簡単に知りたいと思います
    (JavaScriptでも役立ちます.)

    1.画像を読み込む


    RxSWIFTへ向かう途中のPromiseKit.
        func promiseLoadImage(from imageUrl: String) -> Promise<UIImage?> {
            return Promise<UIImage?>() { seal in
                asyncLoadImage(from: imageUrl) { image in
                    seal.fulfill(image)
                }
            }
        }
    画像の関数をPromiseKitで受信します.
    画像を受信し、Promiseに戻ります.

    2.画像のロード


    画像をロードする関数を見てみましょう
        @IBAction func onLoadImage(_ sender: Any) {
            imageView.image = nil
    
            promiseLoadImage(from: LARGER_IMAGE_URL)
                .done { image in
                    self.imageView.image = image
                }.catch { error in
                    print(error.localizedDescription)
                }
        }
    上の約束LoadImageでPromiseに戻ると、doneの後にモジュールを実行し、エラーが発生した場合.catchを実行します.
    非常に簡単な方法でAsyncはイメージをロードします.

    RxSwift


    1.画像を読み込む


    今回はRxSWIFTから画像を読み込む関数を見てみましょう.
        func rxswiftLoadImage(from imageUrl: String) -> Observable<UIImage?> {
            return Observable.create { seal in
                asyncLoadImage(from: imageUrl) { image in
                    seal.onNext(image)
                    seal.onCompleted()
                }
                return Disposables.create()
            }
        }
    PromiseKitとよく似ていることがわかります.
    同様に、画像をSealに配置し、PromiseではなくObserverableを返します.
    画像をfull()ではなくonNext関数に渡します.

    2.画像のロード


    画像をロードする関数を見てみましょう
        @IBAction func onLoadImage(_ sender: Any) {
            imageView.image = nil
    
            _ = rxswiftLoadImage(from: LARGER_IMAGE_URL)
                .observeOn(MainScheduler.instance)
                .subscribe({ result in
                    switch result {
                    case let .next(image):
                        self.imageView.image = image
    
                    case let .error(err):
                        print(err.localizedDescription)
    
                    case .completed:
                        break
                    }
                })
        }
    いいえ.done()です.subscribe()で実行します.
    PromiseKitまたはRxSwift
    asyncは簡単な動作を実現するユーティリティです.
    では、どんな違いがありますか.
    私たちはどうしてRxSWIFTを勉強しますか?
    ReactiveX公式ホームページを見て

    Docsには5つのドキュメントがあります.
    これらは私たちが勉強しなければなりません.

    3. Disposable


    まず、Disposableについて説明します.

    簡単に[読み込み](Load)をクリックすると、画像が表示されるプログラムをエンコードしてみます.
        // MARK: - IBOutlet
    
        @IBOutlet var imageView: UIImageView!
        @IBOutlet var countLabel: UILabel!
    
        // MARK: - IBAction
    
        @IBAction func onLoadImage(_ sender: Any) {
            imageView.image = nil
    
            _ = rxswiftLoadImage(from: LARGER_IMAGE_URL)
                .observeOn(MainScheduler.instance)
                .subscribe({ result in
                    switch result {
                    case let .next(image):
                        self.imageView.image = image
    
                    case let .error(err):
                        print(err.localizedDescription)
    
                    case .completed:
                        break
                    }
                })
        }
    
        @IBAction func onCancel(_ sender: Any) {
            // TODO: cancel image loading
        }
    
        // MARK: - RxSwift
    
        func rxswiftLoadImage(from imageUrl: String) -> Observable<UIImage?> {
            return Observable.create { seal in
                asyncLoadImage(from: imageUrl) { image in
                    seal.onNext(image)
                    seal.onCompleted()
                }
                return Disposables.create()
            }
        }
    さっきやったようにrxswiftLoadImageで傍観者に戻ります購読すればいいです.
    しかし、現在進行中のObserverableを停止するにはキャンセルをクリックしますか?
    使い捨てでいいです.
        var disposable: Disposable?
    
        @IBAction func onLoadImage(_ sender: Any) {
            imageView.image = nil
    
            disposable = rxswiftLoadImage(from: LARGER_IMAGE_URL)
                .observeOn(MainScheduler.instance)
                .subscribe({ result in
                    switch result {
                    case let .next(image):
                        self.imageView.image = image
    
                    case let .error(err):
                        print(err.localizedDescription)
    
                    case .completed:
                        break
                    }
                })
        }
    
        @IBAction func onCancel(_ sender: Any) {
            // TODO: cancel image loading
            disposable?.dispose()
        }
    外には使い捨てというDisposableがありますか?作成、
    func rxswiftLoadImageで作成されたオブジェクトは、一度に宣言できます.
    onCancelを押せばいいです処理すればいいです.
    しかし、アプリケーションを考えると、使い捨てではないようです.DisposeBagは、多くの使い捨て用品を扱う案です.
    DisposeBagを使用して複数のDisposableを処理します.

    4. DisposeBag

        var disposebag: DisposeBag = DisposeBag()
    
        @IBAction func onLoadImage(_ sender: Any) {
            imageView.image = nil
    
            let disposable = rxswiftLoadImage(from: LARGER_IMAGE_URL)
                .observeOn(MainScheduler.instance)
                .subscribe({ result in
                    switch result {
                    case let .next(image):
                        self.imageView.image = image
    
                    case let .error(err):
                        print(err.localizedDescription)
    
                    case .completed:
                        break
                    }
                })
            disposebag.insert(disposable)
        }
    
        @IBAction func onCancel(_ sender: Any) {
            // TODO: cancel image loading
            disposebag = DisposeBag()
        }
    disposebagオブジェクトを作成し、一度に挿入します.
    袋の中の使い捨て品を処分するとき、
    .dispose()がないことを確認できます.
    再宣言(disposebag=DisposeBag()の場合は、すべて処理されます.