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

 黄勋佩淑青宜合 发布于 2023-01-11 22:55

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

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

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

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

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

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

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

    2023-01-11 23:09 回答
  • 虽然它不是内置的语言功能,但可能有趣的是,它可以实现C#style async/ awaitfor Swift,并且由于函数调用的最后一个闭包参数提供了特殊的语法,它甚至看起来喜欢它可能是语言的一部分.

    如果有人有兴趣,你可以在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")
    }
    

    2023-01-11 23:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有