Я использую наблюдение и @ObServable во всем моем приложении, и, как правило, у меня нет необходимости в комбинации. Тем не менее, я сталкивался с ситуациями, когда мне нужны дебютинг и тройки, и я не вижу другого прочного решения, за исключением того, чтобы сделать это старым путем ... так что, таким образом, вопрос, потому что я не знаю, что такое правильный способ сделать это при использовании структуры наблюдения.final class Debouncer: ObservableObject {
private var cancellables = Set()
private let tapSubject = PassthroughSubject()
func sendTap(for itemId: String?) {
guard let itemId else { return }
tapSubject.send(itemId)
}
var handleFavoriteTap: ((String) -> Void)?
init() {
tapSubject
.debounce(for: .milliseconds(300), scheduler: RunLoop.main)
.sink { [weak self] itemId in
self?.handleFavoriteTap?(itemId)
}
.store(in: &cancellables)
}
}
< /code>
Тогда: < /p>
@State private var debouncer = Debouncer()
< /code>
и: < /p>
.onAppear {
debouncer.handleFavoriteTap = { itemId in
firestoreManager.addFavorite(documentID: itemId)
}
< /code>
и, наконец: < /p>
.onTapGesture {
debouncer.sendTap(for: item.id)
}
< /code>
Так что это работает ... Кроме того, я сделал это с Asyncstream (кажется, работает правильно): < /p>
@State private var tapContinuation: AsyncStream.Continuation?
private func startTapStream() {
let tapStream = AsyncStream { continuation in
self.tapContinuation = continuation
}
Task {
for await itemId in tapStream
.debounce(for: .milliseconds(200))
{
firestoreManager.addFavoriteTip(documentID: itemId)
}
}
}
< /code>
и: < /p>
.onAppear {
startTapStream()
}
< /code>
Но я не совсем уверен, какой подход использовать, или есть ли лучший способ справиться с этим, потому что, вероятно, есть больше вещей, которые я должен рассмотреть в коде Asyncstream (например, сохраняя ссылку на текущую задачу TAP, чтобы я мог отменить его на Ondisappear ...). Это просто похоже на слишком много хлопот для простого дебайта, и импорт комбинации только для него также не звучит великолепно ... так что же является предпочтительным способом в наши дни для этого?
Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-combine
Есть ли способ реализовать Debouncer без использования Combine? ⇐ IOS
Программируем под IOS
-
Anonymous
1757104512
Anonymous
Я использую наблюдение и @ObServable во всем моем приложении, и, как правило, у меня нет необходимости в комбинации. Тем не менее, я сталкивался с ситуациями, когда мне нужны дебютинг и тройки, и я не вижу другого прочного решения, за исключением того, чтобы сделать это старым путем ... так что, таким образом, вопрос, потому что я не знаю, что такое правильный способ сделать это при использовании структуры наблюдения.final class Debouncer: ObservableObject {
private var cancellables = Set()
private let tapSubject = PassthroughSubject()
func sendTap(for itemId: String?) {
guard let itemId else { return }
tapSubject.send(itemId)
}
var handleFavoriteTap: ((String) -> Void)?
init() {
tapSubject
.debounce(for: .milliseconds(300), scheduler: RunLoop.main)
.sink { [weak self] itemId in
self?.handleFavoriteTap?(itemId)
}
.store(in: &cancellables)
}
}
< /code>
Тогда: < /p>
@State private var debouncer = Debouncer()
< /code>
и: < /p>
.onAppear {
debouncer.handleFavoriteTap = { itemId in
firestoreManager.addFavorite(documentID: itemId)
}
< /code>
и, наконец: < /p>
.onTapGesture {
debouncer.sendTap(for: item.id)
}
< /code>
Так что это работает ... Кроме того, я сделал это с Asyncstream (кажется, работает правильно): < /p>
@State private var tapContinuation: AsyncStream.Continuation?
private func startTapStream() {
let tapStream = AsyncStream { continuation in
self.tapContinuation = continuation
}
Task {
for await itemId in tapStream
.debounce(for: .milliseconds(200))
{
firestoreManager.addFavoriteTip(documentID: itemId)
}
}
}
< /code>
и: < /p>
.onAppear {
startTapStream()
}
< /code>
Но я не совсем уверен, какой подход использовать, или есть ли лучший способ справиться с этим, потому что, вероятно, есть больше вещей, которые я должен рассмотреть в коде Asyncstream (например, сохраняя ссылку на текущую задачу TAP, чтобы я мог отменить его на Ondisappear ...). Это просто похоже на слишком много хлопот для простого дебайта, и импорт комбинации только для него также не звучит великолепно ... так что же является предпочтительным способом в наши дни для этого?
Подробнее здесь: [url]https://stackoverflow.com/questions/79757138/is-there-a-way-to-implement-the-debouncer-without-using-combine[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия