2011-10-07 35 views
6

Tôi cố gắng để thực hiện thao tác này trên các chủ đề chính:performSelectorOnMainThread với nhiều tham số

[curItem.mButton setBackgroundImage:newArt forState:UIControlStateNormal]; 

Vì vậy, tôi làm điều này ...

cWrapperObject* obj = [cWrapperObject alloc]; 
[obj setupParams :curItem.mButton :newArt]; 
[obj performSelectorOnMainThread:@selector(setImageForButton) withObject:nil waitUntilDone:YES]; 

tôi cảm thấy như thế này là xấu, không ai có bất kỳ đề xuất về cách tôi có thể tiếp cận điều này một cách khác nhau?

Trả lời

13

Một tùy chọn khác là GCD. Bạn có thể gọi một khối trên hàng đợi chính được chạy serially khi chạy vòng lặp chạy. các khối không bị giới hạn đối với một đối tượng như performSelectorOnMainThread.

dispatch_async(dispatch_get_main_queue(), ^{ 
    // code here 
}); 

Tôi đã viết một so sánh toàn diện hơn về performSelectorXXX và GCD đầy đủ tại đây với mẫu:

GCD, Threads, Program Flow and UI Updating

Ngoài ra, đây là khác liên quan SO bài:

GCD to perform task in main thread

4

Nếu bạn chỉ cần truyền một tham số, bạn nên thiết lập đối số "withObject:" trong phương thức performSelectorOnMainThread:withObject:waitUntilDone. Vì vậy, phương pháp của bạn nên được khai báo là

-(void)setImageForButton:(id)parameter 

và bạn nên gọi phương thức trên chủ đề chính với:

[obj performSelectorOnMainThread:@selector(setImageForButton:) withObject:newArt waitUntilDone:YES]; 

Note ':' trong @selector(setImageForButton:) điều này có nghĩa rằng phương pháp này sẽ được nhắn tin cho với một đối số, thông qua trong withObject:

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