swift 定時器的使用

在swift中,要使用定時器就須要用到對象NSTimer。經過NSTimer的實例化後,就能夠調用fire方法來啓用了。swift

NSTimer有2個構造函數函數

init(timeInterval ti: NSTimeInterval, invocation: NSInvocation!, repeats yesOrNo: Bool) -> NSTimer

init(timeInterval ti: NSTimeInterval, target aTarget: AnyObject!, selector aSelector: Selector, userInfo: AnyObject!, repeats yesOrNo: Bool) -> NSTimer

經過個人實踐後,發現這2個構造函數都是假的,基本上不能使用。第一個構造函數的invocation參數貌似swift尚未實現(xCode6 beta)經過mac+left click點進去後,裏面啥也沒有。到是在stackoverflow上看到有大神使用的,沒有嘗試:orm

NSMethodSignature *sgn = [self methodSignatureForSelector:@selector(onTick:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature: sgn];
[inv setTarget: self];
[inv setSelector:@selector(onTick:)];

NSTimer *t = [NSTimer timerWithTimeInterval: 1.0
                      invocation:inv 
                      repeats:YES];

顯然在swift中,尚未NSInvocation.invocationWithMethodSignature方法的實現。對象

第二個構造函數,經過它能夠實例化NSTimer對象,但只能觸發一次。以後就沒用了,貌似repeats的參數是沒有做用的。blog

var timer = NSTimer(1.0, target: self, selector: "timerFireMethod:", userInfo: nil, repeats:true);
timer.fire()

後來看到網上你們都使用的靜態函數的形式實例化,也嘗試了一下,居然成功了:內存

    func doTimer(){
        var timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "timerFireMethod:", userInfo: nil, repeats:true);
        timer.fire()
    }
    func timerFireMethod(timer: NSTimer) {
        var formatter = NSDateFormatter();
        formatter.dateFormat = "MM/dd/yyyy HH:mm:ss"
        var strNow = formatter.stringFromDate(NSDate())
        txta.text  = "\(strNow)"
    }

程序的目的就是在view上的label中實時顯示當前的時間。get

 

總結:string

一、NSTimer只能使用靜態函數來實例化該對象it

二、使用靜態函數來實例化對象的時候,居然須要傳一個實例對象的方法(經過selector),這個感受有些違背面向對象的思想的。任何對象的成員的訪問都須要經過實例化對象來調用。swift中有全局函數,想一想也釋然了,畢竟他是一門剛出來的語言仍是須要時間沉澱的。io

三、在模擬器中,運行10分鐘,程序所使用的memory,從12.0MB上升到了12.5MB。感受對內存的要求仍是比較高的,不知道有沒有其它更好的方法實現。

相關文章
相關標籤/搜索