Ich erhalte zwei Arten von Informationen mit JSON und ich füge "operations" zu 2 verschiedenen Operations Queues-Klassen mit addObserver hinzu (forKeyPath: "operations" ...) . In der Funktion observeValue überprüfe ich ob operationQueue1.operations.isEmpty und dann aktualisiere ich meine Informationen in UI. Ich mache dasselbe mit if sonst mit operationQueue2, aber wenn die 2 Operationen gestartet werden, stürzt die Anwendung manchmal ab mit der Fehlermeldung: *** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <AppName.ViewController 0x102977800> for the key path "operations" from <AppName.OperationQueue1 0x1c4a233c0> because it is not registered as an observer
. ' Ich habe kein Problem, wenn nur 1 Operation gestartet wird. Irgendwelche Vorschläge?Swift - Anwendungsabsturz bei Verwendung zweier verschiedener OperationQueues mit KVO
func getInfo1(){//runned in viewDidLoad
operationQueue1.addObserver(forKeyPath:"operations"...)
operationQueue1.dataTask(URL:"..."....){
DispatchQueue.main.async{
NotificationCenter.default.postNotification(NSNotification.Name(rawValue: "NewDataReceived1", userInfo:infoFromTheWebsite)
}
}
}
func NewDataReceived1(){
here I add the information to arrays to be loaded in tableView1
}
HERE IS THE CODE FOR 2ND INFO WHICH IS THE SAME
override func observeValue(forKeyPath keyPath: String?, ....){
if(object as? operationQueue1 == operationQueue1Class && keyPath == "operations" && context == context1){
if(operationQueue1.operations.isEmpty){
DispatchQueue.main.async{
operationQueue1..removeObserver(self, forKeyPath:"operations")
Timer.scheduled("refreshingTableInformation1")
}
}
}else if(operationQueue2....){
SAME AS OPERATION 1, BUT USING DIFFERENT FUNC TO REFRESH TABLE INFORMATION AND THE TABLES ARE DIFFERENT
}else{
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
}
}
func refreshingTableInformation1(){
tableView1.reloadData()
Timer.scheduled("getInfo1", repeat:false)
}
func refreshingTableInformation2(){
tableView2.reloadData()
Timer.scheduled("getInfo2", repeat:false)
}
Manchmal funktioniert es 10 Sekunden und Absturz und manchmal für mehr als 60 Sekunden arbeitet und dann abstürzen ...
Wie der Fehler sagt, versuchen Sie, einen View-Controller vom Beobachten des Operationsschlüsselpfads Ihrer 'OperationQueue1' zu entfernen, obwohl der View-Controller nicht als Beobachter registriert ist. Dies könnte möglicherweise auftreten, wenn Sie den Verweis auf die VC geändert haben. Veröffentlichen Sie den Code Ihrer Operationswarteschlange und geben Sie den Beobachter an. –
Ich füge den Beobachter vor den 2 Anfragen hinzu und sie sind in einem unendlichen Kreis eingeschlossen. Wenn ich die Informationen in der Benutzeroberfläche aktualisiere, setze ich den Beobachter erneut und ich starte die Anfrage, um die Information erneut zu bekommen. –
Ihr Code ist nicht sehr klar. Wie auch immer, warum nicht stattdessen einen Beobachter auf das Array setzen, das 'NewDataReceived1' sammelt? wäre einfacher zu handhaben. Wenn Sie Synchronisierungsprobleme haben, ist es besser, für Ihre HTTP-Anfragen Bibliotheken wie Alamofire zu verwenden. Das würde dir eine Menge Ärger ersparen. – Alex