【问题标题】:How to observe an array of NSObjects in swift?如何快速观察对象数组?
【发布时间】:2015-05-08 23:23:55
【问题描述】:

我是 swift 语言的新手,我的问题是如何在 swift 中使用 observable/observer 模式。

我想让我的数组在我的 SocketManager 类中是可观察的,以便我的 UIViewController 类可以观察到它。我使用了由 Andrew J Wagner 编写的 Observable 类,我从这个链接获得:

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

我有数组:

var marketIndexList: Array = []

将从服务器获取数据。每次从服务器接收到新数据时,都会更新此列表。从服务器获取 Array 的值后,我想将其设为 Observable 类,该类由上述链接实现:

marketIndexList = Observable(marketIndexList)

但我得到了这个错误:

“MarketIndex”与“AnyObject”不同

MarketIndex 是一个 NSObject 类型的类,它具有一些 String 类型的属性。

这是我用过的 Observable 类:

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

谁能告诉我问题出在哪里?

还有谁知道快速观察对象数组的方法?

我将不胜感激。

提前致谢。

【问题讨论】:

    标签: arrays swift nsobject observable observers


    【解决方案1】:

    错误是因为 marketIndexList 被定义为 Array&lt;MarketIndex&gt; 但您分配了 Observable 实例。也许你想做这样的事情:

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

    顺便说一句,你也可以使用 Swift 的 Objective-C KVO。只需将该属性标记为dynamic 并确保该类继承 NSObject 以使该属性可观察。例如:

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

    除了您提到的内容之外,这篇文章还适合阅读 Swift 中的 KVO。 https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba

    【讨论】:

    • 谢谢,但这并不能解决我的问题。此行仍然存在相同的错误:marketIndexList = Observable(marketIndexList) I cannot make my array observable.
    • 抱歉,我误会了您想使用 Swift 的 Objective-C KVO。我编辑了我的答案。
    • 感谢中型链接,我宁愿使用这种方法,这样我们就可以充分利用 swift!
    猜你喜欢
    • 2018-12-16
    • 2019-09-09
    • 2013-05-30
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多