我正在编写一个iOS Swift应用程序,它在启动时需要从服务器获取2(或更多)组数据。在初始化期间,我必须对数据集进行一些处理 - 将它们合并在一起。只有这样我才能启动视图控制器并与用户交互。初始化期间获得的数据是一个对象数组,我在我的应用程序中无处不在。
首先,我将代码放在视图控制器的viewDidLoad中,但它很快就变得混乱了。现在,我将所有这些代码放在“单例”类中,以便我的所有视图控制器都可以重用相同的数据。我的单例类是使用以下代码摘录定义的:
class Teams {
var teams: [Team]
static var sharedInstance = Teams()
private init() {
teams = []
let queryText = "CardTypeOWSTEXT:Root"
//The first async call (DataManager invokes the http REST to the server)
DataManager.spSearch (queryText, success: { teamsJson -> Void in
let json = JSON(data: teamsJson)
...
// all the code to handle the data received from the server
...
})
//The second async call
DataManager.spSocialFollowedSites ({ sitesJson -> Void in
let json = JSON(data: sitesJson)
...
// all the code to handle the data received from the server
...
})
我是iOS开发的新手,我尝试复制我在AngularJS中编写的现有应用程序。在该应用程序中,调用对服务器的REST调用并使用promises非常简单,我所要做的就是等待两者完成以执行与以下语句的匹配:
$q.all([promise1, promise2]).then(...)
但这是javascript / angular,而不是Swift!我知道有promises库(例如PromiseKit),但我想知道这是否是正确的方法呢?使用GCD会更简单/更好吗?另外,我使用单身人士的方法有意义吗?它的目的是保存所有其他类共享的数据,并且在角度上,同样的概念是一个工厂并且工作得很好......
我已阅读过很多地方,无法获得任何好的指导,所以任何帮助都会受到赞赏!
答案 0 :(得分:0)
I use PromiseKit in my code and I'm very satisfied, that said - you can always synchronise without it. It's called a semaphore. Basically:
Basically, something like:
var counter = 2
var firstResult: teamsJsonType?
var secondResult: sitesJsonType?
let handler = ... ; // function code that runs when both results are ready
DataManager.spSearch (queryText, success: { teamsJson -> Void in
firstResult = teamsJson
counter -= 1
if counter == 0 { handler() }
})
DataManager.spSocialFollowedSites ({ sitesJson -> Void in
secondResult = sitesJson
counter -= 1
if counter == 0 { handler() }
})