Swift对异步编程有什么语言级支持(如果有的话)?

时间:2014-06-03 09:02:39

标签: multithreading asynchronous swift

当应用程序必须通过不可预测的网络(例如智能手机应用程序)进行通信时,异步编程是响应式用户界面的必需条件。用户界面必须保持响应,同时等待结果从互联网上的服务器返回。

在大多数语言中,应用程序员必须实现自己的状态机(可能使用闭包)来响应异步回调和/或使用锁来协调多个线程。

这两个都非常容易出错,而且不适合那些不满意的人!

(c#引入了async关键字来帮助解决这个问题,只有时间(至少5年)会判断它是否是一个好的解决方案。)

Swift是否有内置支持来帮助编写异步代码?

2 个答案:

答案 0 :(得分:13)

虽然它不是内置语言功能,但值得注意的是it's possible to implement C# style async/await for Swift,并且因为函数调用的最后一个闭包参数提供了特殊的语法,它甚至看起来喜欢它可能是语言的一部分。

如果有人有兴趣,您可以获取此on Bitbucket的代码。在这里可以快速了解:

let task = async { () -> () in
  let fetch = async { (t: Task<NSData>) -> NSData in
    let req = NSURLRequest(URL: NSURL.URLWithString("http://www.google.com"))
    let queue = NSOperationQueue.mainQueue()
    var data = NSData!
    NSURLConnection.sendAsynchronousRequest(req,
                                            queue:queue,
      completionHandler:{ (r: NSURLResponse!, d: NSData!, error: NSError!) -> Void in
        data = d
        Async.wake(t)
      })
    Async.suspend()
    return data!
  }

  let data = await(fetch)
  let str = NSString(bytes: data.bytes, length: data.length,
                     encoding: NSUTF8StringEncoding)

  println(str)
}

此外,如果你想要@synchronized之类的东西,试试这个:

func synchronized(obj: AnyObject, blk:() -> ()) {
  objc_sync_enter(obj)
  blk()
  objc_sync_exit(obj)
}

var str = "A string we can synchronise on"

synchronized(str) {
  println("The string is locked here")
}

答案 1 :(得分:11)

Swift的异步编程方法与Objective C相同:使用Grand Central Dispatch。您可以将闭包传递给gcd dispatch_函数,就像在ObjC中一样。但是,出于美观原因,您还可以在闭括号后传递闭包(块):

dispatch_async(dispatch_get_main_queue()) {
    println("async hello world")
}