#序文
この記事は、前の記事の最後に記載されている代替品RxSwift
です。
この記事の長さは長すぎます。関連する内容はCombine
、のです。これdemo
はCombine
、完全に使用できます。Combine
調査のURLは記事の最後に添付され、記事のソースコードも添付されます。
古い伝統、写真を見てください
#ネットワーク層の置き換え
対応するを追加したMoya/Combine
後、ネットワーク層のネットワーク補足のカプセル化メソッドを使用し、、、メソッドも提供request()
します。次に、キャッシュ関連をに抽出次のようにカプセル化します。memoryCacheIn(_)
onStorage(_:atKeyPath:onDisk:)
extension
Moya+XTCache.swift
extension TargetType {
public func request() -> AnyPublisher<Response, MoyaError> {
xtProvider.requestPublisher(.target(self))
}
/// 使用时间缓存策略, 内存中有数据就不请求网络
public func memoryCacheIn(_ seconds: TimeInterval = 180) -> TargetOnMemoryCache {
TargetOnMemoryCache(target: self, cacheTime: seconds)
}
/// 读取磁盘缓存, 一般用于启动时先加载数据, 而后真正的读取网络数据
public func onStorage<T: Codable>(_ type: T.Type, atKeyPath keyPath: String? = nil, onDisk: ((T) -> ())?) -> TargetOnDiskStorage<T> {
let diskStore: TargetOnDiskStorage<T> = .init(target: self, keyPath: keyPath)
if let storage = diskStore.readDiskStorage(type) { onDisk?(storage) }
return diskStore
}
}
复制代码
memoryCache
の処理には、extension AnyPublisher {}
次のような方法は採用されていません。
extension AnyPublisher {
func request() -> AnyPublisher<Response, MoyaError> where Output == (TargetType, TimeInterval), Failure == MoyaError {
flatMap { tuple -> AnyPublisher<Response, MoyaError> in
let target = tuple.0
let cacheKey = target.cacheKey
if let response = cachedResponse(for: cacheKey) {
return CurrentValueSubject(response).eraseToAnyPublisher()
}
return target.request().map { response -> Response in
kMemoryStroage.setObject(response, forKey: cacheKey, expiry: .seconds(seconds))
return response
}
.eraseToAnyPublisher()
}
.eraseToAnyPublisher()
}
}
复制代码
サブスクライブすると、使用に価値があることがCurrentValueSubject
保証されます。具体的な比較RxSwift
表については、記事の最後にある補足セクションを参照してください。Combine
#ViewModelの置き換え
Combine
がPubliser
指定されてFailure
いるため、送信しませんが、次のようにタイプとして明確に定義できます。RxSwift
error
Observable
AnyPublisher<SendType, Never>
// RxSwift
var moreData: Observable<DynamicDisplayModel> { get }
// Combine
var moreData: AnyPublisher<DynamicDisplayModel, Never> { get }
复制代码
Combine
に置き換えます。PassthroughSubject<SendType, Never>
RxSwift
PublishSubject<SendType>
ここで注意すべきことの1つは、エラーを示す次の画像に示すようにCombine
、flatMap
演算子はのRxSwift
ように使いやすいわけでということです。
AnyPublisher<XTListResultModel, MoyaError>
このiOS 13
バージョンではAnyPublisher<Result<XTListResultModel, Error>, Never>
、への変換がサポートされていませんiOS 14
。後で使用できます。以下に示すように、この部分を使用してをmap
置き換えます。
#補充
1.学習URLを組み合わせる:
推奨読書順序
2.サプリメントを組み合わせる
receive(on: main)
subscribe(on: main)
と違い。receive(on: main)
のコードはで実行されることが保証.sink {}
さmain thread
れています。詳細については、 subscribe-revciveの記事を参照してください。
3.パブリッシャーをカスタマイズします
デモにはTextureDemoViewController.swift
カスタムのものがありJsonDataPublisher
ます。とから学ぶ習慣もありMoya/Combine
ます。Nuke/Combine
Publisher
4. Kingfisher、SnapKitを削除します
デモのMOON
ブランチSnapKit
使用されていて場所が小さすぎるために削除され、手書きの制約レイアウトに置き換えられました
// SnapKit
button.snp.makeConstraints { make in
make.left.equalToSuperview()
make.top.equalToSuperview()
make.bottom.equalToSuperview()
make.width.equalToSuperview().dividedBy(CGFloat(count))
}
// AutoLayout
button.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
button.leftAnchor.constraint(equalTo: previousButton?.rightAnchor ?? self.leftAnchor),
button.topAnchor.constraint(equalTo: self.topAnchor),
button.bottomAnchor.constraint(equalTo: self.bottomAnchor),
button.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 1/CGFloat(count))
])
复制代码
純粋に個人的な利益Nuke
のためにreplaceを使用してください。Kingfisher
詳細なNuke
手順については、 Nuke-DocおよびNuke-demoを参照してください。
読んでくれてありがとう。