2009-09-22 15 views
14

Một cuộc gọi thông thường để performSelectorOnMainThread: trông như thế này:Làm cách nào để gọi performSelectorOnMainThread: với bộ chọn mất> 1 đối số?

[target performSelectorOnMainThread:action withObject:foo waitUntilDone:NO]; 

nơi "kết quả" là một lập luận truyền cho "hành động". Hành động tương ứng sẽ là:

- (void)doSomethingWithThing1:(id *)thing1 

Cú pháp chính xác để gọi hành động có> 1 đối số là gì? Chẳng hạn như:

- (void)doSomethingWithThing1:(id *)thing1 andThing2(id *)thing2 andAlsoThing3(id *)thing3 

[target performSelectorOnMainThread:action withObject:??? waitUntilDone:NO]; 
+0

Hướng dẫn tốt về cách thực hiện việc này. http://goodliffe.blogspot.com/2011/01/ios-performselectoronmainthread-with.html –

Trả lời

8

Để đáp lại similar question trên đi qua phi vật thể để một phương pháp trong performSelectorOnMainThread:, tôi chỉ ra Dave Dribin của category on NSObject, cho phép bạn làm điều gì đó như sau:

[[person dd_invokeOnMainThread] doSomethingWithThing1:thing1 andThing2:thing2 andAlsoThing3:thing3]; 

để thực hiện phương pháp đa lập luận của mình về các chủ đề chính. Tôi nghĩ đây là một giải pháp khá thanh lịch. Đằng sau hậu trường, anh ta kết thúc mọi thứ trong một NSInvocation, gọi nó lên chủ đề chính.

Amber framework cũng tương tự như thế này.

+0

Ngọt. Cảm ơn vì viên ngọc này Brad. – dugla

1

Nếu bạn muốn duy trì phương pháp chữ ký của người nhận sau đó tôi nghĩ rằng bạn sẽ cần phải nhìn vào sử dụng NSInvocation cho phép bạn chỉ định nhiều giá trị đối số.

Bạn có thể kết thúc cuộc gọi và sử dụng từ điển làm vùng chứa cho các đối số của mình như được đề xuất trong câu trả lời khác nhưng với tôi điều này có vẻ hơi giống một chút mã.

Một giải pháp tốt hơn dọc theo dòng này sẽ là tạo một lớp đóng gói các giá trị đối số - tức là cách tiếp cận được nhập mạnh mẽ. Vì vậy, ví dụ thay vì đi qua firstname, surname, bạn sẽ chuyển một phiên bản của một lớp học Person. Đây có lẽ là một tuyến đường tốt hơn để đi xuống vì các phương pháp có ít đối số hơn có thể mang lại mã sạch hơn - nhưng đó là một số whole other story.

15

Bạn có thể làm điều đó bằng cách đặt args của bạn trong một từ điển hoặc mảng và qua đó để một chức năng đặc biệt

- (void)doStuff:(NSString *)arg1 and:(NSString *)arg2 and:(NSString *)arg3 { 
... 
} 

- (void)doStuff:(NSArray *)argArray { 
    [self doStuff:[argArray objectAtIndex:0] 
       and:[argArray objectAtIndex:1] 
       and:[argArray objectAtIndex:2]; 
} 
+1

Điều này không hoạt động nếu một trong các đối số là không. –

+5

nó cũng không hoạt động với voi màu hồng ... điểm của bạn là gì? – coneybeare

+2

@GrantlandChew có một điểm quan trọng - bạn không thể ngây thơ sử dụng NSArray, bạn sẽ cần dịch các giá trị nil sang NSNull. Ngoài ra tôi nghĩ rằng voi màu hồng thực sự là một phân lớp của NSString. –

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