2015-01-27 3 views
1

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

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

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) 

ответ

7

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

Try убедившись, что они торчат вокруг некоторое время ...

Например, начиная с шаблона проекта IOS Single View Application в 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 
    } 
} 
+0

Попробуйте назначить значения таймера и очереди на мой вид карты. Тот же результат. Любые советы о том, как это сделать? – user3751185

+0

Мое единственное предположение (из того, что вы здесь сказали) заключается в том, что ваш вид карты * также * уходит в какой-то момент. Я добавил тривиальный пример, когда очередь и таймер принадлежат AppDelegate, и он работает так, как ожидалось. – ipmcc

Смежные вопросы