在使用SwiftUI / Combine开发过程中,避免在ViewModel中放置可取消标签的方法如下:
AnyCancellable
类型来管理订阅和取消订阅。AnyCancellable
是一个可以持有和取消订阅的对象,可以通过将其存储在ViewModel中来管理订阅。Set<AnyCancellable>
属性,用于存储所有的订阅。这个属性可以在ViewModel的生命周期内持有所有的订阅。sink
方法来订阅Combine流,并将返回的AnyCancellable
对象添加到上一步创建的Set<AnyCancellable>
属性中。cancel()
方法来取消所有的订阅。例如,在SwiftUI的onDisappear
方法中调用cancel()
方法。下面是一个示例代码:
import SwiftUI
import Combine
class ViewModel: ObservableObject {
private var cancellables = Set<AnyCancellable>()
func fetchData() {
// 使用Combine进行网络请求
URLSession.shared.dataTaskPublisher(for: URL(string: "https://example.com")!)
.map { $0.data }
.decode(type: MyData.self, decoder: JSONDecoder())
.sink { completion in
// 处理请求完成的情况
} receiveValue: { data in
// 处理请求成功的情况
}
.store(in: &cancellables) // 将订阅添加到Set中
}
func cancelSubscriptions() {
cancellables.forEach { $0.cancel() } // 取消所有订阅
}
}
struct ContentView: View {
@StateObject private var viewModel = ViewModel()
var body: some View {
Text("Hello, World!")
.onAppear {
viewModel.fetchData()
}
.onDisappear {
viewModel.cancelSubscriptions()
}
}
}
在上面的示例中,ViewModel使用cancellables
属性来存储所有的订阅。在fetchData()
方法中,订阅了一个网络请求的Combine流,并将返回的AnyCancellable
对象添加到cancellables
中。在视图销毁时,调用cancelSubscriptions()
方法来取消所有的订阅。
这样,我们就可以在ViewModel中避免放置可取消标签,并且能够正确地管理订阅和取消订阅。
领取专属 10元无门槛券
手把手带您无忧上云