【发布时间】:2017-02-01 09:27:24
【问题描述】:
我有一个核心数据项目,我正在从多个来源检索数据。并不是所有的数据都会被保存,所以我创建了一个结构来在保存之前传递数据。
struct SearchResult {
var myURL: String?
var myHeadline: String?
init() {}
init(myURL: String, myHeadline: String) {
self.myURL = myURL
self.myHeadline = myHeadline
}
}
因为我想在UITableView 中显示部分,所以我也为此创建了一个struct:
struct ResultsObjects {
var sectionName: String?
var sectionObjects = [SearchResult]()
init() {}
init(sectionName: String) {
self.sectionName = sectionName
}
}
最后,我创建了一个singleton 来保留SearchResult 对象,然后再将它们保存到managedObjectContext。
class SearchResultsArray {
static let sharedInstance = SearchResultsArray()
var resultsObjectsArray = Array<ResultsObjects>()
fileprivate init() {}
}
我的目标是让SearchResultsArray 类可以通过多个类访问,并能够将ResultsObjects 转储到一个类中,并在另一个类中查看ResultsObjects。
在MyViewController 上,我将SearchResultsArray 实例化如下:
var resultsObjectsArray = SearchResultsArray.sharedInstance.resultsObjectsArray
我有一个UITableViewController,我使用resultsObjectsArray 来填充。
在MyViewController 上,按钮调用一个方法,该方法使用MyParserClass 中的方法来解析网页。这也有效。
MyParserClass 以与MyViewController 相同的方式声明resultsObjectsArray:
var resultsObjectsArray = SearchResultsArray.sharedInstance.resultsObjectsArray
在MyParserClass 中,调用了一个方法来创建SearchResult 对象,将它们转储到ResultsObjects 并将它们附加到SearchResultsArray.resultsObjectsArray。这工作正常。我在创建ResultsObjects 的方法中添加了以下行,这些resultsObjectsArray 被转储到resultsObjectsArray:
print("\(resultsObjectsArray.count) ResultsObjects in SearchResultsArray")
delegate.updateSearchResults()
我在MyViewController 的updateSearchResults 委托方法中抛出了一个打印语句,它返回0,不管MyParserClass 在调用委托方法之前所说的内容。
应用程序没有崩溃,但我似乎遇到了单例问题。非常感谢任何建议:我做错了什么。
【问题讨论】:
-
你看过这个帖子stackoverflow.com/questions/26742138/singleton-in-swift 吗?它表明我们都应该声明类
final以确保我们不会得到倍数——可能值得一试 -
数组是swift中的值类型。您不能使用实例变量来引用数组。您必须始终使用
SearchResultsArray.sharedinstance.resultsObjectsArray -
@Paulw11 哇!我知道我错过了一些简单的东西,但是哇!非常感谢你的回复。非常感谢。
-
既然这样,改变结构内部的值也是一个问题——我读到了一个名为
lenses的模式。这很有趣。只是谷歌lenses swift或这个起点github.com/narfdotpl/lenso