单身人士无法按预期工作

时间:2017-01-31 17:04:08

标签: ios swift singleton

我有一个Core Data项目,我正在从多个来源检索数据。并非所有数据都会被保存,所以我创建了一个结构来在保存之前传递数据。

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以与resultsObjectsArray相同的方式声明MyViewController

var resultsObjectsArray = SearchResultsArray.sharedInstance.resultsObjectsArray

MyParserClass中,调用一个方法来创建SearchResult个对象,将它们转储到ResultsObjects并将它们附加到SearchResultsArray.resultsObjectsArray。这很好用。我在创建ResultsObjects的方法中投入了以下一行,这些方法被转储到resultsObjectsArray中:

print("\(resultsObjectsArray.count) ResultsObjects in SearchResultsArray")
delegate.updateSearchResults()

我在MyViewController的{​​{1}}委托方法中抛出了一个print语句,它返回0,无论在调用委托方法之前,updateSearchResults所说的是什么。

该应用程序没有崩溃,但似乎我遇到了单身人士的问题。任何建议:非常感谢我做错了。

2 个答案:

答案 0 :(得分:1)

数组是swift中的值类型;当你将一个数组赋值给一个变量然后将该变量赋值给另一个变量时,第二个变量引用原始数组的副本,而不是原始数组(从技术上讲,为了提高效率,数组在修改时复制,而不是在赋值时复制,但是结果是相同的),因此对原始数组所做的更改不会反映在第二个变量的数组中。

考虑

var someArray = [Int]()
var someOtherVariable = someArray
someArray.append(2)

someArray将包含单个值,而someOtherVariable仍为空。

一个解决方案始终使用SearchResultsArray.sharedinstance.resultsObjectsArray而不是局部变量/属性。

也许更好的方法是通过提供一些函数来操作它来将数组封装在你的单例类中。例如;

class SearchResultsArray {
    static let sharedInstance = SearchResultsArray()
    var resultsObjectsArray = Array<ResultsObjects>()

    public var results: [ResultsObjects] {
       get {
           return resultsObjectsArray
       }
    }


    public func add(results: ResultsObjects) {
        resultsObjectsArray.append(results)
    }


    fileprivate init() {}
}

由于results现在是一个只读属性,并且存在单独的add函数,因此该类更清楚地定义了它的语义。

答案 1 :(得分:0)

我以非常类似的方式使用单身 - 但我的定义完全不同。

编辑 - 不同,现在被取代: - (

在我的单身DataModelInstance中,我有这个

class DataModelInstance : NSObject, NSCoding
{
    // define all of the variables I need within the singleton

    class var sharedInstance : DataModelInstance
    {
        struct Singleton
        {
            static let instance = DataModelInstance()
        }
        return Singleton.instance
    }

    // everything else that I need in the class...
}

然后,在每个需要访问它的类中,我定义一个变量

    var dataModel = DataModelInstance.sharedInstance