Je voudrais créer un Observable à partir de anyCollection qui émettra chaque élément un par un, après un délai. Aussi, onNext, je voudrais effectuer quelques mises à jour de l'élément (modèle).
Par exemple:
// Nourrissez tous les chiens, un par un, avec un intervalle de 5 secondes.
class Dog {
var name: String?
var age: Int?
var feeded = false
init(_ name: String, _ age: Int){
self.name = name
self.age = age
}
}
func feedDogs(){
let dog1 = Dog("Ren", 3)
let dog2 = Dog("Bega", 7)
let dog3 = Dog("Xuxu", 11)
let delay = 6 // seconds
let allDogs = [dog1, dog2, dog3]
// Observable....
// Expected results after subscribe
// Start - > 0 seconds
// dog1.feeded // true
// time lapse -> 6 seconds
// dog2. feeded // true
// timelapse -> 12 seconds
// dog3.feeded // true
}
J'ai essayé d'utiliser "zip" comme "zipWith" (dans RxJava), mais il semble que dans RxSwift n'est pas pris en charge.
3 réponses
Eh bien ... après quelques R&D, c'est une version de travail testée pour ma question.
Observable.zip(Observable.from(allDogs), Observable<Int>.interval(RxTimeInterval(delay), scheduler: MainScheduler.instance)).subscribe(onNext: { (dog, index) in
print(dog.name)
}
)
Hmm, la façon la plus simple à laquelle je puisse penser (peut-être pas si élégante cependant) est la suivante.
Vous créez une minuterie.
let timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(count), userInfo: nil, repeats: true)
Et un compteur
var counter : Int = 0
Et dans le sélecteur faites ceci
@objc func count(){
print("i am being here")
rxTimer.value = ()
}
Où rxTimer est une variable définie
var rxTimer = Variable<(())>(())
Alors vous appelez simplement l'observer le rxTimer comme tel
rxTimer.asDriver()
.map { (_) -> Int? in
if self.counter == collection.count{
timer.invalidate()
return nil
}
let value = collection[self.counter]
self.counter += 1
return value
}
.filter{$0 != nil}
.map{$0!}
Où collectio est votre collection définie. Ici, je le définis comme un int, mais vous pouvez le définir comme vous le souhaitez.
J'ai écrit l'extension à cet effet.
extension Observable {
func with(interval: RxTimeInterval) -> Observable {
return enumerated()
.concatMap { index, element in
Observable
.just(element)
.delay(index == 0 ? RxTimeInterval.seconds(0) : interval,
scheduler: MainScheduler.instance)
}
}
}
Échantillon:
Observable.from([1, 2, 3, 4, 5])
.with(interval: RxTimeInterval.seconds(1))
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
De nouvelles questions
swift
Swift est un langage de programmation polyvalent sûr, rapide et expressif développé par Apple Inc. pour ses plateformes et Linux. Swift est open-source. Utilisez la balise uniquement pour les questions sur les fonctionnalités linguistiques ou nécessitant du code dans Swift. Utilisez les balises [ios], [ipados], [macos], [watch-os], [tvos], [cocoa-touch] et [cocoa] pour les questions (indépendantes du langage) sur les plates-formes ou les frameworks.