沸騰ページコピーの補足-組み合わせる

640.PNG

#序文

この記事、前の記事の最後に記載されている代替品RxSwiftです。

この記事の長さは長すぎます。関連する内容はCombine、のです。これdemoCombine、完全に使用できます。Combine調査のURLは記事の最後に添付され、記事のソースコードも添付されます。

古い伝統、写真を見てください

シミュレーターのスクリーンショット-iPhone13-2022-04-12at 12.31.03.png

#ネットワーク層の置き換え

対応するを追加したMoya/Combine後、ネットワーク層のネットワーク補足のカプセル化メソッドを使用し、、、メソッドも提供request()ます。次に、キャッシュ関連をに抽出次のようにカプセル化します。memoryCacheIn(_)onStorage(_:atKeyPath:onDisk:)extensionMoya+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の置き換え

CombinePubliser指定されFailureいるため、送信ませんが、次のようにタイプとして明確に定義できます。RxSwifterrorObservableAnyPublisher<SendType, Never>

// RxSwift
var moreData: Observable<DynamicDisplayModel> { get }

// Combine
var moreData: AnyPublisher<DynamicDisplayModel, Never> { get }
复制代码

Combineに置き換えますPassthroughSubject<SendType, Never>RxSwiftPublishSubject<SendType>

ここで注意すべきことの1つは、エラーを示す次の画像に示すようにCombineflatMap演算子はのRxSwiftように使いやすいわけでということです。

flatmap.png

AnyPublisher<XTListResultModel, MoyaError>このiOS 13バージョンではAnyPublisher<Result<XTListResultModel, Error>, Never>、への変換がサポートされていませんiOS 14。後で使用できます。以下に示すように、この部分を使用してをmap置き換えます。

map.png

#補充

1.学習URLを組み合わせる:
  1. Combine入門

  2. RxswiftとCombineの比較表

  3. Combine-Chineseを使用する

推奨読書順序

2.サプリメントを組み合わせる

receive(on: main)subscribe(on: main)違い。receive(on: main)のコードはで実行されることが保証.sink {}main threadれています。詳細については、 subscribe-revciveの記事を参照してください。

3.パブリッシャーをカスタマイズします

デモにはTextureDemoViewController.swiftカスタムのものがありJsonDataPublisherます。とから学ぶ習慣もありMoya/CombineますNuke/CombinePublisher

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を参照してください。

読んでくれてありがとう。

おすすめ

転載: juejin.im/post/7085567111170359327