Tôi nhận được hai loại thông tin với JSON và tôi đang thêm "hoạt động" vào 2 Lớp hoạt động xếp hàng khác nhau với addObserver (forKeyPath: "operations" ...) . Trong hàm observValue tôi đang kiểm tra xem operationQueue1.operations.isEmpty và sau đó tôi làm mới thông tin của mình trong giao diện người dùng. Tôi đang làm điều tương tự với if else với operationQueue2, nhưng khi 2 hoạt động được bắt đầu trong đôi khi các ứng dụng sụp đổ với thông báo lỗi: *** 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
. ' Tôi không gặp vấn đề gì khi chỉ có 1 thao tác được bắt đầu. Bất kỳ đề xuất?Swift - Lỗi ứng dụng khi sử dụng hai OperationQueues khác nhau với 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)
}
Đôi khi nó hoạt động 10 giây và sụp đổ và đôi khi làm việc cho hơn 60 giây và sau đó sụp đổ ...
Giống như lỗi nói, bạn đang cố gắng xóa bộ điều khiển chế độ xem khỏi quan sát đường phím hoạt động của 'OperationQueue1' mặc dù trình điều khiển chế độ xem không được đăng ký làm người quan sát. Điều này có thể xảy ra nếu bạn tham chiếu đến vc đã thay đổi. Đăng mã của hàng đợi hoạt động của bạn và nơi bạn đang thêm người quan sát. –
Tôi đang thêm người quan sát trước 2 yêu cầu và họ bị khóa trong vòng kết nối vô hạn. Khi tôi cập nhật thông tin trong giao diện người dùng, tôi đặt lại người quan sát và tôi bắt đầu yêu cầu nhận lại thông tin. –
Mã của bạn không rõ ràng. Dù sao, tại sao không đưa một người quan sát vào mảng thu thập 'NewDataReceived1' thay thế? sẽ dễ xử lý hơn. Ngoài ra, nếu bạn gặp sự cố đồng bộ hóa, tốt hơn bạn nên sử dụng các lib như Alamofire cho các yêu cầu http của bạn. Điều này sẽ phụ tùng cho bạn rất nhiều rắc rối. – Alex