2010-06-16 22 views
6

Tôi đang cố gắng thực hiện đa luồng trong Mục tiêu C. Điều tôi muốn làm bây giờ là, đối với một số đối tượng, Tôi muốn có cách gọi chức năng 5 giây sau đó. Tôi có thể làm như thế nào?Cách Lên lịch Gọi phương thức trong Mục tiêu C

Trong Coco 2D, rất dễ thực hiện. Họ có một cái gì đó gọi là scheduler. Trong mục tiêu C, làm thế nào để làm điều đó xin vui lòng?

Cảm ơn

Trả lời

13

Bạn có thể sử dụng performSelector:withObject:afterDelay:

Ví dụ:

[self performSelector:@selector(myFunc:) withObject:nil afterDelay:5.0]; 
+0

thanks. cũng quan tâm: + (void) cancelPreviousPerformRequestsWithTarget: (id) aTarget selector: (SEL) đối tượng aSelector: (id) anArgument –

+0

Đoạn mã trên có lỗi, sau khi cuộc gọi chọn không cần thiết cho các phương thức không có đối số. [self performSelector: @selector (myFunc) withObject: nil afterDelay: 5.0]; – archieoi

2

Thêm vào những gì đã được nói, nếu bạn muốn vượt qua một đối số duy nhất để MyFunc, cuộc gọi có thể được sửa đổi như sau

[self performSelector:@selector(showNote:) withObject:@"S" afterDelay:1.0]; 

và nếu bạn cần gọi phương thức lấy nhiều hơn 1 đối số, bạn có thể thực hiện điều đó bằng cách sử dụng lời gọi như được hiển thị trong đoạn mã sau -

SEL selector = @selector(nextPicture:); 
NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
[invocation setSelector:selector]; 

//Set the arguments 
[invocation setTarget:self]; 
NSString* str = [imageNames objectAtIndex:1]; 
[invocation setArgument:&str atIndex:2]; 
[NSTimer scheduledTimerWithTimeInterval:5.0f invocation:invocation repeats:NO]; 
+1

Trước khi chuyển sang 'NSInvocation', tôi khuyên bạn nên sử dụng' dispatch_after'. Chỉ cần bắt đầu nhập nó vào Xcode và chấp nhận tự động hoàn thành, và đặt mã của bạn để được thực hiện sau một sự chậm trễ trong khối. – MaxGabriel

+0

đề xuất tốt, cảm ơn! –

+0

dispatch_after là một đề xuất tuyệt vời, và thực sự là điều mà tôi thậm chí không biết đến cho đến bây giờ. Đó là một đoạn mã cực kỳ hữu ích vì nó làm cho nó dễ dàng hơn nhiều để gọi các phương thức mà lấy một hoặc nhiều đối số dễ dàng hơn nhiều (hoặc nhiều phương thức trong một hàng). Về cơ bản, một cuộc gọi khối bị trì hoãn vô cùng hữu ích hơn là giới hạn cho một bộ chọn duy nhất. – Corbin87

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