提取 JSON API 响应并在 Swift 中存储或引用它的正确方法?

Proper way to pull JSON API response and store or reference it in Swift?

我想知道是否有 "proper" 方法来处理来自 API 请求的 JSON 响应。

现在我有一个包含静态变量的结构。在 AppDelegate 中,我从 URL 中获取 JSON(使用 Alamofire)。稍后我可以在不同的视图中引用它,但是我读到有比 "struct hack" 更好的方法来处理这个问题。

我的目标是尽量减少调用量,并且只在适当的时候刷新(即用户 "pulls down to refresh"、"new object inserted into database" 等)。这应该是我处理它的方式,还是我应该根据需要在每个新视图上加载不同的 JSON 响应?

欢迎任何指导。


编辑:我在这里读到结构是 "hack" 对应 "global variable"。也许将 JSON 存储在结构中不同于将典型的用户变量保存在一个结构中。我不知道。见第二个回答的备注。

Global Variables in Swift

至于我有的结构:

在我的jsonDataHolder.swift文件中:

struct jsonDataHolder {
    static var jsonData:AnyObject = []
}

在我的 AppDelegate.swift 文件中,我在 DidFinishLaunchingWithOptions 部分中有以下内容:

Alamofire.request(.GET, "http://xxxxxxxxxx.com/yyy", encoding: .JSON).responseJSON { (_, _, JSONData, _) in
    jsonDataHolder.jsonData = JSONData!
}

同样,一切正常。只是不确定它是否是 "right"(如果有这样的事情)的方式。

不过,如果我正确理解了这个问题,这似乎是经常争论的 "singletons are evil" 讨论。由于我们应该避免在 Stack Overflow 上争论意见,我将简单地向您推荐 What is so bad about singletons?

不过,我必须承认,我发现更麻烦的是这个 JSON 结构缺乏任何明确的接口。我宁愿看到一个带有一些逻辑 public 接口的模型对象。

对于当前对象,您的整个应用程序(或至少与该对象交互的所有内容)都依赖于 JSON.

的私有实现细节

避免单例模式的建议不应被接受为教条,但您应该考虑通常提供该建议的原因(使测试复杂化,导致不适当的紧耦合代码等)。如果您采用像 AnyObject 这样的模式来掩盖依赖于实现的 JSON 结构,那么就没有必要担心单例模式,因为您已经将所有这些 limitations/problems你的代码已经。