2015-03-07 18 views
8

Hızlı dilde yenilik yapıyorum ve sorunum, gözlemlenebilir/gözlem desenini hızlı bir şekilde nasıl kullanacağım.Hızlı bir dizi NSObjects nasıl gözlemlenir?

Dizim, SocketManager sınıfımda gözlemlenebilir olmasını sağlamak için UIViewController sınıfım tarafından izlenebilir.

var marketIndexList:

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

Ben dizi var: Ben bu bağlantıdan var Andrew J Wagner tarafından yazılan gözlemlenebilir sınıfını kullandık Diziyi < MarketIndex> = []

Verilerini bir sunucudan alacak. Bu liste sunucudan her yeni veri alındığında güncellenecektir. Ben sunucudan benim Array değerlerini aldıktan sonra, yukarıdaki bağlantıyı tarafından uygulanan tip gözlemlenebilir sınıfın yapmak istiyorum:

marketIndexList = gözlemlenebilir (marketIndexList)

Ama bu hata var:

'MarketIndex', 'AnyObject' ile aynı değildir.

MarketIndex, Type String'in bazı özelliklerine sahip olan NSObject türünde bir sınıftır.

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

kimse sorunun ne olduğunu bana söyleyebilir:

Bu gözlemlenebilir ben kullandım sınıftır?

Ayrıca, hızlı bir şekilde bir nesne dizisini gözlemlemek için bir yöntem bilen var mı?

Herhangi bir yardım için minnettarım.

Şimdiden teşekkürler.

cevap

2

Hata, marketIndexList'un Array<MarketIndex> olarak tanımlandığından, ancak Observable örneğini atandınız. Belki böyle bir şey yapmak istedim:

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

// Or maybe 
observableList = Observable(marketIndexList) 

arada, aynı zamanda Swift gelen Objective-C Kvo kullanabilirsiniz. Sadece özelliği dynamic olarak işaretleyin ve sınıfın mülkü gözlemlenebilir hale getirmek için NSObject öğelerini devraldığından emin olun. Örneğin:

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

Bu gönderi, atıfta bulunulanlara ek olarak Swift'de KVO için okunması iyidir. https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba

+0

Teşekkürler, ama bu benim sorunumu çözmüyor. Aynı satır bu satırda hala mevcut: marketIndexList = Gözlemlenebilir (marketIndexList) Dizilimimi gözlemlenebilir yapamıyorum. – user2366997

+0

Üzgünüz, Swift'den Objective-C KVO'yu kullanmak istediğinizi yanlış anladım. Cevabımı düzenledim. –

+0

Orta bağlantı için teşekkürler, bu yaklaşımı kullanmayı tercih ederim, böylece hızlı bir şekilde en iyi şekilde faydalanabiliriz! – gbdavid