Je Thing
et ThingManager
Swift 3, faire minuterie, ajouter au dictionnaire, ne sort jamais de
Si personne ne parle pendant un certain temps un Thing
spécifique, je veux ThingManager
l'oublier. J'ai essayé les minuteries par bloc et les minuteries basées sur RunLoop. Ils ne semblent jamais à « partir »
struct Thing {
var name: String
}
class ThingManager {
var things: [String: Thing] = [:]
fileprivate var thingWatchingRunLoop = RunLoop()
fileprivate var thingWatchingQueue = DispatchQueue.global(qos: .utility)
fileprivate var thingWatchingTimers: [String: Timer] = [:]
func addThing(_ thing: Thing) {
self.things[thing.name] = thing
}
func sawSomeThing(named name: String) {
self.thingWatchingQueue.async {
// re-up the timer so we don't forget about that thing
if let timer = self.thingWatchingTimers[name] {
timer.invalidate()
}
let timer = Timer(timeInterval: 5.0, target: self, selector: #selector(self.timerWentOff(_:)), userInfo: ["name":name], repeats: false)
self.thingWatchingRunLoop.add(timer, forMode: .commonModes)
self.thingWatchingTimers[name] = timer
}
}
@objc func timerWentOff(_ timer: Timer) {
let info = timer.userInfo as! [String: String]
let name = info["name"]
self.removeThing(named: name!)
}
func removeThing(named name: String) {
self.things.removeValue(forKey: name)
}
}
mise à jour, la version à base de blocs: https://gist.github.com/lacyrhoades/f917b971e97fdecf9607669501ef6512
Merci! '.current' fonctionne bien dans l'instanciation, mais pas si vous le demandez à la demande, dans la file d'attente de répartition. '.main' semble toujours fonctionner indépendamment du contexte, donc je suis allé avec ça. Je ne suis pas sûr que je goupille complètement la relation des files d'attente pour exécuter des boucles ou vice versa. – snakeoil
Mise à jour: Il n'y a peut-être pas besoin d'une file d'attente de répartition. J'étais inquiet de voir les choses se déranger mais eh. Docs: "La classe NSRunLoop n'est généralement pas considérée comme thread-safe et ses méthodes ne devraient être appelées que dans le contexte du thread courant.Vous ne devriez jamais essayer d'appeler les méthodes d'un NSRunLoop ..." – snakeoil
Très vrai Je n'ai pas remarqué ça avant. Avec l'exemple que vous avez donné ci-dessus ne devrait pas être un problème. Vous ne faites référence à la chose que par la clé "name" passée à travers les informations de l'utilisateur. La file d'attente d'expédition semble juste comme la complexité inutile. –