繁体   English   中英

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

[英]How to access model class values in another controller using singleton in swift?

我创建了一个带有一些变量的类,并且未使用任何默认值进行初始化,在进行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) 
}

这是一个非常糟糕的架构决策。

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

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

我建议更多阅读Singleton模式(如果需要)以及iOS中的体系结构模式。

使用不同的函数加载数据并在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

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

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
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM