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

Multithreading Swift对异步编程有什么语言级别的支持(如果有)?,multithreading,asynchronous,swift,Multithreading,Asynchronous,Swift,当应用程序必须通过不可预测的网络(如智能手机应用程序)进行通信时,异步编程是响应用户界面的必备工具。用户界面必须保持响应,同时等待互联网上某个服务器返回结果 在大多数语言中,应用程序程序员必须实现自己的状态机(可能使用闭包)来响应异步回调和/或使用锁协调多线程 这两种方法都很容易出错,而且不适合忠实的人 (c#引入async关键字来帮助解决这个问题,只有时间(至少5年)才能判断它是否是一个好的解决方案) Swift是否有任何内置的支持来帮助编写异步代码?Swift的异步编程方法与目标C相同:使用

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

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

这两种方法都很容易出错,而且不适合忠实的人

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


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

Swift的异步编程方法与目标C相同:使用Grand Central Dispatch。您可以将闭包传递给gcd分派函数,就像在ObjC中一样。但是,出于美观考虑,您也可以在右括号后传递闭包(块):

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

虽然它不是一个内置的语言特性,但值得注意的是,由于函数调用的最后一个闭包参数具有特殊的语法,它甚至看起来可能是语言的一部分

如果有人对此感兴趣,您可以获取相关代码。这里有一个快速品尝的可能:

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

目标C的可能副本有@synchronization关键字,所以这似乎不是真的。@Blaze你是说@synchronized?这是调用
objc\u sync\u enter()
/
objc\u sync\u exit()
的真正的语法糖分。如果你喜欢,你可以在SWIFT中做到这一点,如果你喜欢的话,你甚至可以添加类似的语法。<代码> @同步< /C> >是一个机制,它早于GCD,通常被认为不如使用GCD。值得注意的是,它使用了一个递归锁,这是一个比使用调度队列更昂贵的同步操作。这很好,但坦白说,这应该是标准的,以使代码更可读。这安全吗?在Objective-C中使用setjmp/longjmp与自动释放池(在运行时作为影子堆栈实现,但不是公共ABI)冲突-据我所知,Swift也使用自动释放。在第二个示例中,如果blk抛出异常怎么办?@gregswis当我最初编写此代码时,Swift没有异常。它仍然没有你想的那种例外。另一方面,如果所讨论的块抛出Objective-C异常,那么您就有麻烦了;但对于Swift代码来说,这通常是正确的。@pmdj这是一个很好的观点;目前看来,它可能并不安全。应该可以通过修改自动释放系统使用的pthread键来修复它,尽管这当然是一次大规模的黑客攻击。我不确定斯威夫特是否使用自动释放,FWIW。
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")
}