請參考一段 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