Swift

时间:2015-07-31 13:43:14

标签: ios swift asynchronous promise

我正在编写一个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会更简单/更好吗?另外,我使用单身人士的方法有意义吗?它的目的是保存所有其他类共享的数据,并且在角度上,同样的概念是一个工厂并且工作得很好......

我已阅读过很多地方,无法获得任何好的指导,所以任何帮助都会受到赞赏!

1 个答案:

答案 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:

  • Set a counter to 2.
  • when a function is done - decrement it by one and save the value.
  • When it hits zero, call a function.

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