2015-03-07 24 views
8

Sono nuovo in un linguaggio veloce e il mio problema riguarda l'utilizzo del pattern osservabile/osservatore in rapido.Come osservare un array di NSObjects in swift?

Voglio rendere il mio array visibile nella mia classe SocketManager in modo che possa essere osservato dalla classe UIViewController. Ho usato la classe Observable scritto da Andrew J Wagner, che ho avuto da questo link:

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

ho la matrice:

var marketIndexList: Array < marketindex> = []

che otterrà i suoi dati da un server. Questo elenco verrà aggiornato ogni volta che un nuovo dato viene ricevuto dal server. Dopo aver ottenuto i valori della mia Array dal server che voglio fare è di tipo classe Observable che viene realizzato tramite il link qui sopra:

marketIndexList = osservabili (marketIndexList)

Ma ho ottenuto questo errore:

'MarketIndex' non è identico a 'AnyObject'

MarketIndex è una classe di tipo NSObject che ha alcune proprietà di tipo String.

Questa è la classe Observable che ho usato:

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

qualcuno può dirmi qual è il problema?

Qualcuno sa anche un modo per osservare una serie di oggetti in rapido?

Apprezzerei qualsiasi aiuto.

Grazie in anticipo.

risposta

2

L'errore è perché marketIndexList è definito come Array<MarketIndex> ma è stata assegnata l'istanza Observable. Forse si voleva fare qualcosa di simile:

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

// Or maybe 
observableList = Observable(marketIndexList) 

Tra l'altro, è anche possibile utilizzare Objective-C KVO da Swift. Contrassegnare la proprietà come dynamic e assicurarsi che la classe erediti NSObject per rendere la proprietà osservabile. Ad esempio:

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

Questo post è buono da leggere per KVO in Swift oltre a quello a cui si è fatto riferimento. https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba

+0

Grazie, ma questo non risolve il mio problema. Lo stesso errore esiste ancora su questa linea: marketIndexList = Observable (marketIndexList) Non riesco a rendere visibile il mio array. – user2366997

+0

Scusa, ho avuto fraintendimenti che volevi usare l'Objective-C KVO di Swift. Ho modificato la mia risposta. –

+0

Grazie per il collegamento medio, preferisco usare questo approccio in modo da poter sfruttare al massimo la velocità! – gbdavid