我正在使用Redux模式来构建消息传递应用程序。到目前为止,一切工作正常,但是随后我注意到我无法解决的应用程序某些部分出现内存泄漏。我的绑定到消息发布者的视图控制器。关闭视图控制器时,不会调用Deinit。
let messages = {
store.$state
.map { $0.chatState.messagesByChannel[self.channelId] }
.removeDuplicates()
.eraseToAnyPublisher()
}()
messages.combineLatest(Just("Hello world"))
.sink { [weak self] (messages, state) in
}
.store(in: &cancellableSet)
当我从引用字典对象更改为处于聊天状态deinit
的另一个对象时,被调用
let chatRoomDetailResponse = {
store.$state
.map { $0.chatState.getChatRoomDetailResponse }
.removeDuplicates()
.eraseToAnyPublisher()
}()
chatRoomDetailResponse.combineLatest(Just("Hello world"))
.sink { [weak self] (messages, state) in
}
.store(in: &cancellableSet)
这是我的商店的小快照:
final public class Store<State: FluxState>: ObservableObject {
@Published public var state: State
private var dispatchFunction: DispatchFunction!
private let reducer: Reducer<State>
和我的ChatState:
public struct ChatState: FluxState {
public typealias ChannelID = String
public var messagesByChannel: [ChannelID: [Message]] = [:]
public var getChatRoomDetailResponse: NetworkResponse<ChatChannel>? = nil
}
答案 0 :(得分:0)
$0.chatState.messagesByChannel[self.channelId]
强烈捕获self
,以便能够访问其最新的channelId
值。
任何一个自我弱化的人:
.map { [weak self] in
guard let strongSelf = self else { return ??? }
$0.chatState.messagesByChannel[strongSelf.channelId]
}
或者如果channelId
不变,则可以使用捕获列表按值捕获它:
.map { [channelId] in $0.chatState.messagesByChannel[channelId] }