2017-09-28 25 views
5

Tôi có đoạn mã sau trong dự án Swift 4 của tôi.Quan sát giá trị quan trọng trong Swift 4

class DishesTableViewController : UITableViewController { 


    private var token :NSKeyValueObservation? 

    @objc dynamic private(set) var dishes :[Dish] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // configure the observation 
     token = self.observe(\.dishes) { object, change in 

      // change is always nil 
      print(object) 
      print(change) 
     } 

     updateTableView() 
    } 

Bất cứ khi nào mảng món ăn được thay đổi, quan sát được kích hoạt. Nhưng câu hỏi của tôi là làm thế nào tôi có thể nhận được sự thay đổi thực sự đã xảy ra. Có nghĩa là làm thế nào tôi có thể nhận được quyền truy cập vào đối tượng Dish thực tế đã kích hoạt thay đổi.

Trả lời

4

Tôi nghĩ lý do change sắp ra mắt với nil là do bạn chưa chỉ định tùy chọn.

Rewrite như sau:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // configure the observation 
    token = self.observe(\.dishes, options: [.new,.old]) { object, change in 

     print(object) 
     let set1 = Set(change.newArray!) 
     let set2 = Set(change.oldArray!) 

     let filter = Array(set1.subtract(set2)) 
     print(filter) 

    } 

    updateTableView() 
} 

Lưu ý rằng tôi đã làm được một chút phỏng đoán đây về đối tượng Dish của bạn. Tôi giả sử bạn đã làm cho nó phù hợp với giao thức Equatable và đây là một bước cần thiết để giải pháp hoạt động.

+0

Trong trường hợp của tôi, 'changeHandler' thậm chí không được gọi hoàn toàn bởi vì tôi chưa bao gồm đối số' tùy chọn'. Tôi sẽ đề nghị bao gồm nó tất cả các thời gian. –

Các vấn đề liên quan