2015-03-07 17 views
8

Tôi mới bằng ngôn ngữ nhanh và vấn đề của tôi là về cách sử dụng mẫu quan sát/quan sát nhanh chóng.Làm thế nào để quan sát một loạt các NSObjects nhanh chóng?

Tôi muốn làm cho mảng của mình có thể quan sát được trong lớp SocketManager của tôi để lớp UIViewController của tôi có thể quan sát nó. Tôi đã sử dụng lớp Quan sát được viết bởi Andrew J Wagner mà tôi nhận được từ liên kết này:

http://www.drewag.me/posts/swift-kvo-substitute-observable-variables

Tôi có mảng:

var marketIndexList: Array < MarketIndex> = []

sẽ nhận dữ liệu từ máy chủ. Danh sách này sẽ được cập nhật mỗi lần một dữ liệu mới nhận được từ máy chủ. Sau khi tôi nhận được các giá trị của mảng của tôi từ máy chủ tôi muốn làm cho nó của kiểu lớp Quan sát được thực hiện bởi liên kết ở trên:

marketIndexList = Quan sát (marketIndexList)

Nhưng tôi đã nhận lỗi này:

'MarketIndex' không giống với 'AnyObject'

MarketIndex là loại thuộc loại NSObject có một số thuộc tính của loại Chuỗi.

Đây là lớp học Quan sát mà tôi đã sử dụng:

import Foundation 


class Observable { 
    typealias DidChangeHandler = (oldValue: Array<MarketIndex>?, newValue: Array<MarketIndex>) ->() 

    var value : Array<MarketIndex> = [] { 
     didSet { 
      for (owner, handlers) in self.observers { 
       for handler in handlers { 
        handler(oldValue: oldValue, newValue: value) 
       } 
      } 
     } 
    } 

    init(_ value: Array<MarketIndex>) { 
     self.value = value 
    } 

    func addObserverForOwner(owner: IndexViewController, triggerImmediately: Bool, handler: DidChangeHandler) { 

     if let index = self.indexOfOwner(owner) { 
      // since the owner exists, add the handler to the existing array 
      self.observers[index].handlers.append(handler) 
     } else { 
      // since the owner does not already exist, add a new tuple with the 
      // owner and an array with the handler 
      self.observers.append(owner: owner, handlers: [handler]) 
     } 

     if (triggerImmediately) { 
      // Trigger the handler immediately since it was requested 
      handler(oldValue: nil, newValue: self.value) 
     } 
    } 

    func removeObserversForOwner(owner: AnyObject) { 
     if let index = self.indexOfOwner(owner) { 
      self.observers.removeAtIndex(index) 
     } 
    } 

    // #pragma mark - Private Properties 

    var observers: [(owner: IndexViewController, handlers: [DidChangeHandler])] = [] 

    // #pragma mark - Private Methods 

    func indexOfOwner(owner: AnyObject) -> Int? { 
     var index : Int = 0 
     for (possibleOwner, handlers) in self.observers { 
      if possibleOwner === owner { 
       return index 
      } 
      index++ 
     } 
     return nil 
    } 
} 

bất cứ ai có thể cho tôi biết vấn đề là gì?

Cũng có ai biết cách quan sát một mảng đối tượng nhanh không?

Tôi sẽ đánh giá cao bất kỳ trợ giúp nào.

Xin cảm ơn trước.

Trả lời

2

Lỗi là do marketIndexList được định nghĩa là Array<MarketIndex> nhưng bạn đã gán Observable ví dụ. Có lẽ bạn muốn làm điều gì đó như thế này:

var observableList: Observable = Observable([]) 
var marketIndexList: Array<MarketIndex> = [MarketIndex(), MarketIndex()] 
observableList.value = marketIndexList  

// Or maybe 
observableList = Observable(marketIndexList) 

Nhân tiện, bạn cũng có thể sử dụng Objective-C KVO từ Swift. Chỉ cần đánh dấu thuộc tính là dynamic và đảm bảo lớp thừa kế NSObject để làm cho thuộc tính có thể quan sát được. Ví dụ:

class ObservableClass: NSObject { 
    dynamic var value = [Int]() 
} 

Bài đăng này rất tốt để đọc cho KVO trong Swift ngoài những gì bạn đã đề cập đến. https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba

+0

Cảm ơn, nhưng điều này không giải quyết được sự cố của tôi. Lỗi tương tự vẫn tồn tại trên dòng này: marketIndexList = Observable (marketIndexList) Tôi không thể làm cho mảng của tôi có thể quan sát được. – user2366997

+0

Xin lỗi, tôi đã hiểu nhầm rằng bạn muốn sử dụng KVO mục tiêu-C từ Swift. Tôi đã chỉnh sửa câu trả lời của mình. –

+0

Cảm ơn bạn đã liên kết trung bình, tôi thích sử dụng phương pháp đó để chúng tôi có thể khai thác nhanh nhất! – gbdavid

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