gpt4 book ai didi

ios - 带分段控制的多线程iOS

转载 作者:行者123 更新时间:2023-12-01 16:13:22 24 4
gpt4 key购买 nike

我有以下任务要做:
我有一个带有两个主要标签的segmented control,第一个标签必须从网络加载广告和数据,它们中的每一个都是通过不同的URL进行的。我想做的是并行查询广告和数据,当它们都完成后,我想将它们合并到一个列表中并显示给用户。这可以通过使用DispatchGroup.enter()轻松地通过.leave()完成。但是,由于这是在带有segmented controlsearch bar中。 DispatchGroup必须为可取消的,以便加载一组新的广告和数据。有没有办法取消DispatchGroup,还是有办法通过其他多线程功能实现此逻辑?

最佳答案

这正是Combine的优势所在(如果您使用的是iOS 13)。也就是说,您可以使您的网络请求具有当前所选段的功能以及在搜索栏中键入的内容,并且当您调用switchToLatest时,它将取消所有未完成的请求,并且仅保留反射(reflect)最新状态的大多数请求。我只是写了一个例子,在这里做到了这一点:
https://github.com/joshuajhomann/Combine-NasaMediaSearch

或更简洁地说,设置两个直通主题,一个用于搜索栏,一个用于分段控件,将它们组合成一个网络请求,用switchToLatest对其进行展平,然后在需要的地方分配结果:

  private var data: [MyData] = []
private var searchTermSubject = PassthroughSubject<String, Never>()
private var segmentSubject = PassthroughSubject<SegmentType, Never>()

...

let searchResults = Publishers
.CombineLatest(
searchTermSubject,
segmentSubject
)
.debounce(for: .milliseconds(250), scheduler: RunLoop.main)
.map { combined -> AnyPublisher<[MyData],Never> in
let (term, segmentType) = combined
guard !(term.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) else {
return Just(.empty).eraseToAnyPublisher()
}
return NetworkRequestPublisher
.search(query: term, mediaType: segmentType)
.replaceErrorWith([])
.eraseToAnyPublisher()
}
.switchToLatest()
.receive(on: RunLoop.main)
// assign or sink here depending on what you want to do

如果您未使用iOS 13,则可以使用OperationQueue或直接在数据任务上调用cancel。

关于ios - 带分段控制的多线程iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58737145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com