2010-02-24 10 views
15

Chciałbym utworzyć wątek z wieloma argumentami. Czy to możliwe? Mam funkcję:Wywołanie selektora z dwoma argumentami w sprawie problemu NSThread

 
-(void) loginWithUser:(NSString *) user password:(NSString *) password { 
} 

I chcę, aby wywołać tę funkcję jako selektor:

 

[NSThread detachNewThreadSelector:@selector(loginWithUser:user:password:) toTarget:self withObject:@"someusername" withObject:@"somepassword"]; // this is wrong 


Jak przekazać dwa argumenty dotyczące parametru withObject tej funkcji detachNewThreadSelect?

Czy to możliwe?

Odpowiedz

16

Trzeba przekazać dodatkowe parametry w obiekcie przekazanym withObject tak:

NSDictionary *extraParams = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"user",@"password",nil] andKeys:[NSArray arrayWithObjects:@"valueForUser",@"valueForPassword",nil]] 

[NSThread detachNewThreadSelector:@selector(loginWithUser:) toTarget:self withObject:extraParams]; 
+0

Dzięki za wielką odpowiedź na to pytanie @Lance. – iPadDeveloper2011

+0

Zapomniałeś średnika na końcu pierwszej linii ;-) – Ken

0

Owiń wybraną metodę z pomocniczą metodę owijania „wrappingMethod”, który przetwarza NSArray wejść do własnych własna metoda przed wywołaniem własnej metody w zakresie wrappingMethod. Teraz odłącz NSThread, który wybiera całą nową wrappingMethod i pobiera instancję NSArray dla withObject.

Odwróć: Posiadanie tu otoki może być szczególnie pomocne, jeśli twoja oryginalna metoda przyjmuje jeden lub więcej typów pierwotnych jako dane wejściowe, a następnie musisz pracować z NSNumber lub NSStrings, na przykład, aby zadowolić NSThread.

6

Jest poza czubek głowy, niesprawdzone:

NSThread+ManyObjects.h:

@interface NSThread (ManyObjects) 

+ (void)detachNewThreadSelector:(SEL)aSelector 
         toTarget:(id)aTarget 
        withObject:(id)anArgument 
         andObject:(id)anotherArgument; 

@end 

NSThread+ManyObjects.m:

@implementation NSThread (ManyObjects) 

+ (void)detachNewThreadSelector:(SEL)aSelector 
         toTarget:(id)aTarget 
        withObject:(id)anArgument 
         andObject:(id)anotherArgument 
{ 
    NSMethodSignature *signature = [aTarget methodSignatureForSelector:aSelector]; 
    if (!signature) return; 

    NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; 
    [invocation setTarget:aTarget]; 
    [invocation setSelector:aSelector]; 
    [invocation setArgument:&anArgument atIndex:2]; 
    [invocation setArgument:&anotherArgument atIndex:3]; 
    [invocation retainArguments]; 

    [self detachNewThreadSelector:@selector(invoke) toTarget:invocation withObject:nil]; 
} 

@end 

a następnie można zaimportować NSThread+ManyObjects i nazywają

[NSThread detachNewThreadSelector:@selector(loginWithUser:user:password:) toTarget:self withObject:@"someusername" andObject:@"somepassword"]; 
0

Aktualizacja miłą odpowiedź ennuikiller za:

NSDictionary* params = [NSDictionary dictionaryWithObjectsAndKeys:@"IMG_URL_VALUE",@"img_url",@"PARAM2_VALUE", @"param2", nil]; 

[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:params]; 
Powiązane problemy