如何观察 swift 中的对象数组?
How to observe an array of NSObjects in swift?
我是 swift 语言的新手,我的问题是关于如何在 swift 中使用 observable/observer 模式。
我想让我的数组在我的 SocketManager class 中可见,这样它就可以被我的 UIViewController class 观察到。我使用了 Andrew J Wagner 编写的 Observable class,我从这个 link:
http://www.drewag.me/posts/swift-kvo-substitute-observable-variables
我有数组:
var marketIndexList: Array< MarketIndex > = []
将从服务器获取数据。每次从服务器收到新数据时,此列表都会更新。从服务器获取数组的值后,我想将其设为 Observable class 类型,由上述 link:
实现
marketIndexList = Observable(marketIndexList)
但是我得到了这个错误:
'MarketIndex' 与 'AnyObject'
不同
MarketIndex 是一个 class 类型的 NSObject,它有一些字符串类型的属性。
这是我使用过的 Observable class:
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 中观察对象数组的方法吗?
如有任何帮助,我将不胜感激。
提前致谢。
错误是因为 marketIndexList
定义为 Array<MarketIndex>
但您分配了 Observable
实例。也许您想做这样的事情:
var observableList: Observable = Observable([])
var marketIndexList: Array<MarketIndex> = [MarketIndex(), MarketIndex()]
observableList.value = marketIndexList
// Or maybe
observableList = Observable(marketIndexList)
顺便说一下,您还可以使用 Swift 中的 Objective-C KVO。只需将 属性 标记为 dynamic
并确保 class 继承 NSObject 以使 属性 可观察。例如:
class ObservableClass: NSObject {
dynamic var value = [Int]()
}
这个 post 除了您提到的内容外,还适合阅读 Swift 中的 KVO。
https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba
我是 swift 语言的新手,我的问题是关于如何在 swift 中使用 observable/observer 模式。
我想让我的数组在我的 SocketManager class 中可见,这样它就可以被我的 UIViewController class 观察到。我使用了 Andrew J Wagner 编写的 Observable class,我从这个 link:
http://www.drewag.me/posts/swift-kvo-substitute-observable-variables
我有数组:
var marketIndexList: Array< MarketIndex > = []
将从服务器获取数据。每次从服务器收到新数据时,此列表都会更新。从服务器获取数组的值后,我想将其设为 Observable class 类型,由上述 link:
实现marketIndexList = Observable(marketIndexList)
但是我得到了这个错误:
'MarketIndex' 与 'AnyObject'
不同MarketIndex 是一个 class 类型的 NSObject,它有一些字符串类型的属性。
这是我使用过的 Observable class:
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 中观察对象数组的方法吗?
如有任何帮助,我将不胜感激。
提前致谢。
错误是因为 marketIndexList
定义为 Array<MarketIndex>
但您分配了 Observable
实例。也许您想做这样的事情:
var observableList: Observable = Observable([])
var marketIndexList: Array<MarketIndex> = [MarketIndex(), MarketIndex()]
observableList.value = marketIndexList
// Or maybe
observableList = Observable(marketIndexList)
顺便说一下,您还可以使用 Swift 中的 Objective-C KVO。只需将 属性 标记为 dynamic
并确保 class 继承 NSObject 以使 属性 可观察。例如:
class ObservableClass: NSObject {
dynamic var value = [Int]()
}
这个 post 除了您提到的内容外,还适合阅读 Swift 中的 KVO。 https://medium.com/proto-venture-technology/the-state-of-kvo-in-swift-aa5cb1e05cba