[RxSwift] 小心使用 flatMap,flatMap vs compacMap

請參考一段 code 裡面使用到 flatMap 來把 self.currentStatus, self.isOutdated 加入到,

然後重新發送一段 Publisher

let combinedPublisher = initialPublisher<br>    .flatMap { [weak weakSelf] initialResult -><br>        AnyPublisher<(Result<SomeModel, Error>, Status, Bool), Never> in<br>        guard let strongSelf = weakSelf else { return Empty().eraseToAnyPublisher() }<br>    return Just((initialResult, strongSelf.currentStatus, strongSelf.isOutdated))<br>            .eraseToAnyPublisher()<br>    }<br>    .sink(receiveValue: { combinedResult in<br>        // 處理結果<br>    })

但其實可以簡單就透過 compactMap 來達到目的

let combinedPublisher = initialPublisher.compactMap { [weak weakSelf] initialResult -> (Result<SomeModel, Error>, Status, Bool)? in<br>    guard let strongSelf = weakSelf else { return nil }<br>    return (initialResult, strongSelf.currentStatus, strongSelf.isOutdated)<br>}<br>.sink(receiveValue: { combinedResult in<br>    // 處理結果<br>})

flatMap 的風險

當 flatMap 被多次觸發時,每次都會創建並訂閱一個新的 Publisher,這可能會導致重複調用。

flatMap vs compacMap

flatMap 方法:適用於需要將一個值轉換為一個新的 Publisher 的情況。可以用於異步操作或進一步的流處理。

compactMap 方法:適用於簡單地過濾 nil 並映射非 nil 值的情況。如果處理過程不需要產生新的 Publisher,只需要對值進行簡單轉換,compactMap 會更簡潔。

選擇哪種方法取決於你的具體需求:

• 如果需要進行更複雜的異步操作或處理流中的多個步驟,使用 flatMap。

• 如果只需要過濾 nil 並進行簡單的值轉換,使用 compactMap。

網頁瀏覽量: 0


尚未有留言,成為第一個留言的人吧!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *