2010-02-24 3 views
15

Ich möchte einen Thread mit mehreren Argumenten erstellen. Ist es möglich? Ich habe die Funktion:Aufruf Selektor mit zwei Argumente auf NSThread Problem

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

Und ich möchte diese Funktion als Wähler nennen:

 

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


Wie zwei Argumente auf withobject Parameter auf dieser detachNewThreadSelect Funktion zu übergeben?

Ist es möglich?

Antwort

16

Sie müssen die zusätzlichen Parameter in einem Objekt zu übergeben übergeben, wie so zu withobject:

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

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

Dank für eine große Antwort auf diese Frage @Lance. – iPadDeveloper2011

+0

Du hast das Semikolon am Ende deiner ersten Zeile vergessen ;-) – Ken

0

mit einem Hilfswickelmethode Ihre gewählte Methode Wrap „wrappingMethod“, die eine NSArray von Eingaben verarbeitet Ihre anpassen eigene Methode vor dem Aufruf Ihrer eigenen Methode innerhalb wrappingMethod. Lösen Sie jetzt einen NSThread, der Ihre gesamte neue Adresse wrappingMethod auswählt und die NSArray-Instanz für withObject übernimmt.

Neben: Einen Wrapper hier zu haben, kann besonders hilfreich sein, wenn Ihre ursprüngliche Methode einen oder mehrere primitive Typen als Eingabe verwendet und Sie dann mit NSNumber oder NSStrings arbeiten müssen, um NSThread zu erfüllen. Diese

6

ist aus der Spitze von meinem Kopf, nicht getestet:

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 

Und dann können Sie importieren NSThread+ManyObjects und rufen

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

Ein Update auf die ennuikiller nette Antwort:

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

[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:params]; 
Verwandte Themen