2015-03-07 4 views
8

Я новичок в быстром языке, и моя проблема заключается в том, как использовать наблюдаемый/наблюдательный паттерн в swift.Как наблюдать массив NSObjects в swift?

Я хочу, чтобы мой массив наблюдался в моем классе SocketManager, поэтому его можно наблюдать по моему классу UIViewController. Я использовал Observable класса, написанный Эндрю Дж Вагнер, который я получил от этой ссылки:

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

У меня есть массив:

уага marketIndexList: Array < MarketIndex> = []

который получит свои данные с сервера. Этот список будет обновляться каждый раз, когда будут получены новые данные с сервера. После того, как я получил значение моего массива от сервера я хочу сделать его типа наблюдаемого класса, который реализуется по ссылке выше:

marketIndexList = Наблюдаемый (marketIndexList)

Но я получил эту ошибку:

«MarketIndex» не идентичен «AnyObject»

MarketIndex - это класс типа NSObject, который имеет некоторые свойства типа String.

Это Наблюдаемые класс, который я использовал:

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 
    } 
} 

Может кто-нибудь сказать мне, в чем проблема?

Также кто-нибудь знает способ наблюдения за массивом объектов в swift?

Буду признателен за любую помощь.

Заранее спасибо.

ответ

2

Ошибка в том, что marketIndexList определяется как Array<MarketIndex>, но вы указали Observable экземпляр. Может быть, вы хотите сделать что-то вроде этого:

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

// Or maybe 
observableList = Observable(marketIndexList) 

Кстати, вы также можете использовать Objective-C КВО от Swift. Просто отметьте свойство как dynamic и убедитесь, что класс наследует NSObject, чтобы сделать свойство наблюдаемым. Например:

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

Это сообщение хорошо читать КВО в Swift в дополнение к тому, что вы упомянули. https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba

+0

Спасибо, но это не решит мою проблему. Такая же ошибка все еще существует в этой строке: marketIndexList = Observable (marketIndexList) Я не могу сделать свой массив видимым. – user2366997

+0

Извините, у меня возникло недоразумение, что вы хотели использовать Objective-C KVO от Swift. Я отредактировал свой ответ. –

+0

Спасибо за среднюю ссылку, я скорее использую этот подход, чтобы мы могли максимально использовать скорость! – gbdavid

Смежные вопросы