2012-06-22 17 views

Trả lời

21

Công văn Grand Central có dispatch_after() sẽ thực hiện một khối sau một thời gian nhất định trên hàng đợi được chỉ định. Nếu bạn tạo một hàng đợi nền, bạn sẽ có chức năng mà bạn mong muốn.

dispatch_queue_t myBackgroundQ = dispatch_queue_create("com.romanHouse.backgroundDelay", NULL); 
// Could also get a global queue; in this case, don't release it below. 
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC); 
dispatch_after(delay, myBackgroundQ, ^(void){ 
    [self delayedMethodWithObject:someObject]; 
}); 
dispatch_release(myBackgroundQ); 
4
[self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)] 

Thực hiện bộ chọn trên chủ đề đang được gọi. Vì vậy, khi bạn gọi nó từ một chủ đề nền, nó sẽ chạy ở đó ...

+0

vấn đề là khi '[tự performSelector: (SEL) withObject: (id) afterDelay: (NSTimeInterval)]' được sử dụng một mình trong một thread nền, nó không chạy –

2

Bạn có thể làm điều đó mỗi ví dụ:

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, <delay in seconds> * NSEC_PER_SEC); 
dispatch_after(delay, dispatch_get_main_queue(), ^{ 
    [self performSelectorInBackground: <sel> withObject: <obj>] 
}); 

Bằng cách nào đó một giải pháp hỗn hợp. Nó sẽ là tốt hơn để gắn bó với một cách tiếp cận đầy đủ GCD tho.

7

Hãy thử như sau:

// Run in the background, on the default priority queue 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    [self performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)] 
}); 

Mã không được kiểm tra

Hãy nhận biết rằng chọn/phương pháp của bạn không được sử dụng tài sản UIKit (do đó, không cập nhật giao diện người dùng) hoặc truy cập UIKit (như khung hình) do đó, bộ chọn của bạn có thể cần phải khởi động lại công việc trở lại chủ đề chính. ví dụ.

(id)SomeMethod:UsingParams: { 

    // Do some work but the results 

    // Run in the background, on the main queue 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Do something UIKit related 
    }); 
} 
+3

1 đề cập đến giao diện người dùng không nên được chạm vào từ một chuỗi nền. – Barjavel

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