如何使用Singleton快速访问另一个控制器中的模型类值?

时间:2018-09-18 12:49:10

标签: ios iphone swift xcode singleton

我创建了一个带有一些变量的类,并且未使用任何默认值进行初始化,因此应在发生Web服务调用时分配所有变量。因此,我已经初始化了类的实例,并将值分配给了变量。

在这里,我想将这些值访问整个项目中的所有类文件。可能吗?我不想使用任何保存方法,例如核心数据和用户默认值,也可以编码本地存储。

请帮帮我吗?我们试图在另一个视图控制器中访问模型类的值。但是我们得到一个零值。预先感谢。

//MARK: Shared Instance
static let sharedInstance = Singleton()

//MARK: Local Variable    
var emptyStringArray : [String]? = nil
var completed : Bool!
var id : Int?
var title : String?
var userId : Int?

//MARK: Init Array
private init() { 
}

init(Fromarray  dictionary : [String:Any]) {
    completed = dictionary["completed"] as? Bool
    id = dictionary["id"] as? Int
    title = dictionary["title"] as? String
    userId = dictionary["userId"] as? Int
}

最终致电

class ViewController2: UIViewController { 

override func viewDidLoad() { 
  super.viewDidLoad() 
  let BoolValue = Singleton.sharedInstance.completed 
  print(BoolValue) 
}

3 个答案:

答案 0 :(得分:1)

这是一个非常糟糕的体系结构决策。

这里的第一个问题是API调用的结果始终是异步的,因此您无法在使用类的属性时就知道类是否已正确初始化。

通过创建依赖于网络调用的强制展开的可选内容,会造成太多歧义。如果API调用失败怎么办?如果互联网连接速度慢怎么办,您现在如何预测自己的单身人士“正常”?在大多数情况下,您将访问nil,这将使您的应用程序崩溃。

我建议您阅读有关Singleton模式(如有必要)以及有关iOS中的体系结构模式的更多信息。

答案 1 :(得分:0)

使用其他功能加载数据并在 WebCall

之后调用
func loadData(Fromarray  dictionary : [String:Any]) {
 completed = dictionary["completed"] as? Bool
 id = dictionary["id"] as? Int
 title = dictionary["title"] as? String
 userId = dictionary["userId"] as? Int
}

网络通话结束后通话

Singleton.sharedInstance.loadData(FromArray : YourDictoinary)

以及整个项目中的

let title = Singleton.sharedInstance.title

答案 2 :(得分:0)

您需要保留单例类的单个对象。

static let sharedInstance = Singleton()

它将创建您单例类的对象。

private init() { } or,

init(fromarray dictionary: [String:Any]) {
    completed = dictionary["completed"] as? Bool
    id = dictionary["id"] as? Int
    title = dictionary["title"] as? String
    userId = dictionary["userId"] as? Int
}

它将创建您的singleton类的另一个对象,该对象与上面的形式有所不同。

如果您需要从单例类访问数据。创建您的课程,例如:

class Singleton {

    static let sharedInstance = Singleton()

    var emptyStringArray: [String]?
    var completed: Bool?
    var id: Int?
    var title: String?
    var userId: Int?

    func initializeData(_ dictionary: [String:Any]) {
        completed = dictionary["completed"] as? Bool
        id = dictionary["id"] as? Int
        title = dictionary["title"] as? String
        userId = dictionary["userId"] as? Int
    }
}

并像这样使用它:

override func viewDidLoad() {
    super.viewDidLoad()

    // Initialize with data
    Singleton.sharedInstance.initializeData(["completed": true, "id": 123, "title": "iOS Title", "userId": 572])

    // Access data
    let boolData = Singleton.sharedInstance.completed
    print(boolData)
}