2014-12-03 25 views
6

Tất cả các ví dụ tôi đã thấy khi sử dụng "NSTimer.scheduledTimerWithTimeInterval" trong Swift show sử dụng tham số "target: self", nhưng tiếc là nó không hoạt động trực tiếp trong Swift Playgrounds.NSTimer.scheduledTimerWithTimeInterval trong Swift Playground

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

Dưới đây là một ví dụ nêu trên mà kết quả trong các lỗi:

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() 

Trả lời

8

Bạn thực sự không nên sử dụng NSTimer những ngày này. Nó tiêu thụ rất nhiều tài nguyên, gây ra sự hao pin không cần thiết, và API cho vay chính nó để mã xấu xí.

Sử dụng dispatch_after() thay vì:

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

Tất nhiên, kể từ khi bộ đếm thời gian sẽ cháy sau khi sân chơi không đó là thứ bạn sẽ cần một tương đương với timer.fire() để buộc các mã để thực thi ngay lập tức thay vì sau một giây chậm trễ 0. Dưới đây là cách hoạt động:

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

dispatch_after(0, dispatch_get_main_queue(), printFrom1To1000) 

printFrom1To1000() 
+0

Trong trường hợp của tôi, tôi phải nhấn webservice sau mỗi 5 phút. Nó sẽ là lựa chọn tốt để sử dụng mã này? –

3

Để có được điều này để chạy trực tiếp trong một Swift sân chơi, bạn cần phải nhúng các chức năng printFrom1To1000 trong một lớp và sau đó thiết lập một Ví dụ của lớp đó với tham số "target:" thay vì sử dụng "self".

Dưới đây là một ví dụ làm việc đầy đủ:

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

Nếu bạn đã có một đối tượng bạn đang tham chiếu (ví dụ, cập nhật một nhãn), bạn có thể mở rộng loại đó và sử dụng chức năng đó là Selector. Tôi thấy điều này dễ dàng hơn việc tạo một lớp hoàn toàn mới và khởi tạo một đối tượng mới từ nó.

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() 
Các vấn đề liên quan