Таймер не повторяется (Grand Central Dispatch)

Я пытаюсь узнать, как отправлять вычисления на фоновый поток и, в конечном итоге, обновлять интерфейс. Когда я пытаюсь сделать это в существующем проекте с Картами Google, «фон», за которым следует «главный», печатается один раз. Больше не печатает, как если бы таймер не повторялся.

Кроме того, когда я создаю пустое приложение и добавляю этот код, ничто не печатает вообще.

let queue = dispatch_queue_create("myTimer", nil); let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC); dispatch_source_set_event_handler(timer) { println("background") dispatch_async(dispatch_get_main_queue(), { println("main") }) } dispatch_resume(timer) 

Убедитесь, что что-то долговечное имеет ссылку как на эту очередь, так и на этот таймер. Без явной проверки, мое впечатление от вашего фрагмента здесь заключается в том, что timer и queue будут выпущены, когда это выходит за рамки. Функция dispatch_resume может привести к тому, что первое событие будет помещено в очередь, что может привести к тому, что queue и timer будут жить достаточно долго, чтобы выполнить первую итерацию, после чего их учетные записи будут равны нулю, и они будут освобождены.

Постарайтесь, чтобы они держались на некоторое время …

Например, начиная с шаблона проекта приложения iOS Single View в Xcode и с помощью следующего в AppDelegate.swift таймер повторяет только штраф:

 import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var queue: dispatch_queue_t? var timer: dispatch_source_t? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { queue = dispatch_queue_create("myTimer", nil); timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC); dispatch_source_set_event_handler(timer) { println("background") dispatch_async(dispatch_get_main_queue(), { println("main") }) } dispatch_resume(timer) return true } }