Есть ли способ реализовать Debouncer без использования Combine?IOS

Программируем под IOS
Ответить
Anonymous
 Есть ли способ реализовать Debouncer без использования Combine?

Сообщение 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 ...). Это просто похоже на слишком много хлопот для простого дебайта, и импорт комбинации только для него также не звучит великолепно ... так что же является предпочтительным способом в наши дни для этого?

Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-combine
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»