2009-09-22 11 views
14

Typowe wywołanie performSelectorOnMainThread: wygląda następująco:Jak wywołać performSelectorOnMainThread: z selektorem, który pobiera> 1 argumenty?

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

gdzie „Wynik” jest argumentem przeszedł do „akcji”. Odpowiednią akcją będzie:

- (void)doSomethingWithThing1:(id *)thing1 

Jaka jest prawidłowa składnia wywołania czynności, która ma> 1 argument? Takich jak:

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

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

Dobry poradnik jak to zrobić. http://goodliffe.blogspot.com/2011/01/ios-performselectoronmainthread-with.html –

Odpowiedz

8

W odpowiedzi na similar question na przejściu niebędące obiektów do sposobu, w performSelectorOnMainThread:, podkreśliłem Dave Dribin na category on NSObject, który pozwala zrobić coś jak następuje:

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

do wykonywania metodę wielu argumentów na głównym wątku. Myślę, że to całkiem eleganckie rozwiązanie. Za kulisami owija rzeczy w NSInvocation, wywołując je w głównym wątku.

Podobnie jest z tym, co robi Amber framework.

+0

Słodki. Dzięki za ten klejnot Brad. – dugla

1

Jeśli chcesz zachować podpis metody odbiornika to myślę, że trzeba spojrzeć na użyciu NSInvocation który pozwala na określenie wielu wartości argumentu.

Możesz zawinąć połączenie i użyć słownika jako pojemnika na argumenty, co sugeruje inna odpowiedź, ale wydaje mi się, że to trochę zapach kodu.

Lepszym rozwiązaniem wzdłuż tej linii byłoby stworzenie klasy, która hermetyzuje wartości argumentów - tj. Podejście silnie typowane. Na przykład zamiast podania firstname, surname przekażemy instancję klasy Person. Prawdopodobnie jest to lepsza trasa, ponieważ metody o mniejszej liczbie argumentów mogą dostarczyć czystszego kodu - ale to jest whole other story.

15

Można to zrobić poprzez umieszczenie swoich args w słowniku lub tablicy i przechodzącej które do specjalnej funkcji

- (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

To nie działa, jeśli jeden z argumentów jest zerowy. –

+5

to również nie działa z różowymi słoniami ... o co ci chodzi? – coneybeare

+2

@GrantlandChew ma ważny punkt - nie możesz naiwnie użyć NSArray, musisz przetłumaczyć zero wartości na NSNull. Myślę też, że różowe słonie są w rzeczywistości podklasą NSString. –

Powiązane problemy