2014-12-03 4 views
6

Все примеры, которые я видел при использовании «NSTimer.scheduledTimerWithTimeInterval» в шоу Swift с использованием параметра «target: self», но, к сожалению, это не работает в Swift Playgrounds напрямую.NSTimer.scheduledTimerWithTimeInterval в Swift Playground

Playground execution failed: <EXPR>:42:13: error: use of unresolved 
identifier 'self' 
    target: self, 

Вот пример ссылки выше, что приводит к ошибке:

func printFrom1To1000() { 
    for counter in 0...1000 { 
     var a = counter   
    } 
} 

var timer = NSTimer.scheduledTimerWithTimeInterval(0, 
    target: self, 
    selector: Selector("printFrom1To1000"), 
    userInfo: nil, 
    repeats: false 
    ) 
timer.fire() 

ответ

8

Вы действительно не должны использовать NSTimer в эти дни. Он потребляет много ресурсов, приводит к ненужной утечке батареи, и API поддается уродливому коду.

Использование dispatch_after() вместо:

dispatch_after(0, dispatch_get_main_queue()) {() -> Void in 
    for counter in 0...1000 { 
    var b = counter 
    } 
} 

Конечно, так как таймер будет срабатывать после площадки делает это материал вам понадобится эквивалент timer.fire(), чтобы заставить код выполнять немедленно, а не после того, как 0 секунд задержки. Вот как это работает:

let printFrom1To1000 = {() -> Void in 
    for counter in 0...1000 { 
    var b = counter 
    } 
} 

dispatch_after(0, dispatch_get_main_queue(), printFrom1To1000) 

printFrom1To1000() 
+0

В моем случае, я должен ударить webservice через каждые 5 минут. Будет ли хороший вариант использовать этот код? –

3

Чтобы получить это запустить непосредственно в Swift Playground, вам нужно встроить функцию printFrom1To1000 в классе, а затем установить экземпляр этого класса к параметру «target:» вместо использования «self».

Вот полный рабочий пример:

class myClass: NSTimer{ 
    func printFrom1To1000() { 
     for counter in 0...1000 { 
      var b = counter 
     } 
    } 
} 

let myClassInstance = myClass() 

var timer = NSTimer.scheduledTimerWithTimeInterval(0, 
    target: myClassInstance, 
    selector: Selector("printFrom1To1000"), 
    userInfo: nil, 
    repeats: false 
) 
timer.fire() 
0

Если у вас уже есть объект, который вы ссылаетесь (то есть, обновляя ярлык), вы можете продлить этот тип и использовать эту функцию в качестве селектора. Я нахожу это проще, чем создание целого нового класса и создание экземпляра нового объекта.

extension SKLabelNode { 
    func updateMe() { 
    count++ 
    label.text = "\(count)" 
    } 
} 

var timer = NSTimer.scheduledTimerWithTimeInterval(0.25, 
    target: label, 
    selector: Selector("updateMe"), 
    userInfo: nil, 
    repeats: true) 
timer.fire() 
Смежные вопросы