請參考一段 code 裡面使用到 flatMap 來把 self.currentStatus, self.isOutdated 加入到,
然後重新發送一段 Publisher
let combinedPublisher = initialPublisher
.flatMap { [weak weakSelf] initialResult ->
AnyPublisher<(Result<SomeModel, Error>, Status, Bool), Never> in
guard let strongSelf = weakSelf else { return Empty().eraseToAnyPublisher() }
return Just((initialResult, strongSelf.currentStatus, strongSelf.isOutdated))
.eraseToAnyPublisher()
}
.sink(receiveValue: { combinedResult in
// 處理結果
})
但其實可以簡單就透過 compactMap 來達到目的
let combinedPublisher = initialPublisher.compactMap { [weak weakSelf] initialResult -> (Result<SomeModel, Error>, Status, Bool)? in
guard let strongSelf = weakSelf else { return nil }
return (initialResult, strongSelf.currentStatus, strongSelf.isOutdated)
}
.sink(receiveValue: { combinedResult in
// 處理結果
})
flatMap 的風險
當 flatMap 被多次觸發時,每次都會創建並訂閱一個新的 Publisher,這可能會導致重複調用。
flatMap vs compacMap
• flatMap 方法:適用於需要將一個值轉換為一個新的 Publisher 的情況。可以用於異步操作或進一步的流處理。
• compactMap 方法:適用於簡單地過濾 nil 並映射非 nil 值的情況。如果處理過程不需要產生新的 Publisher,只需要對值進行簡單轉換,compactMap 會更簡潔。
選擇哪種方法取決於你的具體需求:
• 如果需要進行更複雜的異步操作或處理流中的多個步驟,使用 flatMap。
• 如果只需要過濾 nil 並進行簡單的值轉換,使用 compactMap。