2012-07-18 28 views
5

Nếu không tạo nhiều trường hợp NSTimer, cách thức sẽ đạt được một NSTimer để kích hoạt một phương thức cụ thể hoặc nhiều lần với các khoảng thời gian khác nhau trong một chuỗi. Ví dụ method1 (0,3 giây), method2 (0,5), method3 (0,7) và vân vân.NSTimer với nhiều khoảng thời gian theo trình tự

Tôi sẽ đánh giá cao nếu ai đó có thể vui lòng chia sẻ bất kỳ mã ví dụ nào.

Trả lời

5

Tôi không chắc mục tiêu cuối cùng của bạn là gì với điều này nhưng sau khi đọc câu hỏi của bạn Tôi khuyên bạn nên thử cách sau, có thể đây là những gì bạn muốn tìm.

bạn nên đặt mã này nơi bạn thường muốn bắt đầu cùng một lớp NSTimer với các khoảng thời gian khác nhau (điều không thể, không may).

{ 
    // ... 
    [self performSelector:@selector(method1) withObject:nil afterDelay:0.3f]; 
    [self performSelector:@selector(method2) withObject:nil afterDelay:0.5f]; 
    [self performSelector:@selector(method3) withObject:nil afterDelay:0.7f]; 
    // ... 
} 

và khi cần hủy lịch trình tất cả các bộ chọn được xếp hàng đợi, hãy sử dụng mã này.

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 
+1

Cảm ơn, tôi đã sử dụng cùng một mã, Ngoài ra tôi đã thêm làm thế nào để hủy bỏ các yêu cầu xếp hàng đợi. –

4

NSTimer chính nó không cung cấp chức năng đó, nó sẽ kích hoạt một lần hoặc nhiều lần trong khoảng thời gian cố định. Bạn sẽ yêu cầu nhiều bộ tính giờ để đạt được hiệu ứng này hoặc di chuyển hoàn toàn từ NSTimer hoàn toàn.

-3

tạo một bộ đếm thời gian với selector với timeinterval = 0,1 từ đó trong phương pháp chọn, bạn có thể kiểm tra bằng cách giữ một biến float tĩnh và thêm 0,1 đến nó mỗi lần như:

static CGFloat counter= 0; 

counter+= 0.1; 

sau đó kiểm tra các giá trị truy cập và gọi các phương thức ur ..

if(0.3 == counter) 
{ 
    [self callMethod1]; 
} 
else if(0.5 == counter) 
{ 
    [self callMethod2]; 
} 
else if(0.7 == counter) 
{ 
    [self callMethod3]; 
} 
... 
... 
.. 
.. 
+0

So sánh phao nổi với == đang yêu cầu sự cố vì chúng là xấp xỉ nhị phân của biểu diễn thập phân. – jbat100

+0

nhưng chúng tôi chỉ thêm 0,1 trong mã của chúng tôi và các giá trị truy cập không xấp xỉ từ các tính toán dựa trên các yếu tố chưa quyết định như hẹn giờ. các giá trị bộ đếm không phụ thuộc vào khoảng thời gian lửa định thời thay vì nó phụ thuộc vào phương thức được gọi ra bao nhiêu lần. nó giống như 'i + = 1; 'vì vậy không nên có bất kỳ vấn đề gì. – samfisher

+1

Tốt hơn để sử dụng số nguyên, tăng số nguyên lên 1 mỗi 100 mili giây và sử dụng 'if ((truy cập% 3) == 0)' etc ... – dreamlax

0

tôi tin rằng bạn nên chuyển khoảng thời gian hiện tại tới bộ chọn được kích hoạt và tiếp tục xử lý nó ở đó. nếu khoảng thời gian là 0,3 bạn gọi method1, 0,5 - method2, rất có thể không có cách nào khác để thực hiện điều này

-1

Thực hiện một wrapper để bọc các cuộc gọi NSTimer phương pháp như thế này:

- (void) CallTimerWithTimeInterval:(float) interval andSelector:(NSString *)methodName 
{ 
SEL selector = selectorFromString(methodName); 
    [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(selector) userInfo:nil repeats:YES]; 
} 

Bạn có thể gọi phương thức này và vượt qua khoảng thời gian và phương thức chọn theo yêu cầu của bạn.

+0

Cảm ơn, tôi đã sử dụng phương pháp khác. Btw nếu tôi sử dụng phương pháp này, tôi có phải dừng hoặc không định giờ mà nó tạo ra ở bất kỳ giai đoạn nào không? làm thế nào tôi sẽ đạt được điều đó? –

+0

Để ngừng bộ hẹn giờ, bạn cần đặt tham số 'lặp lại' thành' NO'. Bạn có thể làm điều đó bằng cách thêm một tham số khác vào hàm wrapper. '- (void) CallTimerWithTimeInterval: (float) interval vàSelector: (NSString *) methodName withRepeats: (BOOL) YESorNO'. –

+0

Cảm ơn sự giúp đỡ, chỉ cần tò mò liệu phương pháp này có tốt hơn phương pháp tôi đã chọn hay không. Kịch bản là tôi sẽ phải gọi phương thức này nhiều lần cho phép nói 10 lần. Nó sẽ tạo ra 10 bản sao của NSTimer được lên lịch để kích hoạt vào thời gian cụ thể. Bây giờ nếu giữa một nơi nào đó tôi muốn chấm dứt các bộ đếm thời gian cùng một lúc, lặp lại NO có thể không giúp đỡ như nó dừng lại cho tái xuất hiện. Sau khi đã lên lịch 10 bản sao, làm thế nào tôi có thể dừng lại. Tạo một biến mẫu của NSTimer và sau đó gửi một thông báo nil? –

Các vấn đề liên quan