[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を考慮して設計します.(怒っているようです)
入社したマイクロアプリケーションはKingFisherを使用しています.
今回はPromiseKitについて簡単に知りたいと思います
(JavaScriptでも役立ちます.)
RxSWIFTへ向かう途中のPromiseKit.
画像を受信し、Promiseに戻ります.
画像をロードする関数を見てみましょう
非常に簡単な方法でAsyncはイメージをロードします.
今回はRxSWIFTから画像を読み込む関数を見てみましょう.
同様に、画像をSealに配置し、PromiseではなくObserverableを返します.
画像をfull()ではなくonNext関数に渡します.
画像をロードする関数を見てみましょう
PromiseKitまたはRxSwift
asyncは簡単な動作を実現するユーティリティです.
では、どんな違いがありますか.
私たちはどうしてRxSWIFTを勉強しますか?
ReactiveX公式ホームページを見て
Docsには5つのドキュメントがあります.
これらは私たちが勉強しなければなりません.
まず、Disposableについて説明します.
簡単に[読み込み](Load)をクリックすると、画像が表示されるプログラムをエンコードしてみます.
しかし、現在進行中のObserverableを停止するにはキャンセルをクリックしますか?
使い捨てでいいです.
func rxswiftLoadImageで作成されたオブジェクトは、一度に宣言できます.
onCancelを押せばいいです処理すればいいです.
しかし、アプリケーションを考えると、使い捨てではないようです.DisposeBagは、多くの使い捨て用品を扱う案です.
DisposeBagを使用して複数のDisposableを処理します.
袋の中の使い捨て品を処分するとき、
.dispose()がないことを確認できます.
再宣言(disposebag=DisposeBag()の場合は、すべて処理されます.
同期ですか、非同期ですか。
アップル、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()の場合は、すべて処理されます.
Reference
この問題について([iOS]-RxSWIFT入門(1)), 我々は、より多くの情報をここで見つけました https://velog.io/@app_shawn/iOS-RxSwift-입문-1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol