Какая поддержка языкового уровня (если таковая имеется) для Swift для асинхронного программирования?

Асинхронное программирование является обязательным для реагирующих пользовательских интерфейсов, когда приложение должно взаимодействовать с непредсказуемыми сетями (например, приложениями смартфонов). Пользовательский интерфейс должен оставаться отзывчивым, ожидая, когда результаты вернутся с серверов где-то через Интернет.

В большинстве языков прикладной программист должен реализовать свои собственные машины состояний (возможно, используя блокировки), чтобы реагировать на асинхронные обратные вызовы и/или координировать умножение потоков с помощью блокировок.

Оба они очень склонны к ошибкам, а не для искреннего!

(С# ввел ключевое слово async, чтобы помочь с этим, только время (не менее 5 лет) сообщит, является ли это хорошим решением.)

Есть ли встроенная поддержка Swift для поддержки написания асинхронного кода?

Ответ 1

Хотя это не встроенная функция языка, может быть интересно отметить, что возможно реализовать стиль С# async/await для 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")
}

Ответ 2

Быстрый подход к асинхронному программированию такой же, как Objective C: используйте Grand Central Dispatch. Вы можете передать закрытие функций gcd ​​dispatch_, как и в ObjC. Однако по эстетическим соображениям вы можете также передать свое закрытие (блок) после ближайших круглых скобок:

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