2010-02-24 15 views
15

Birden çok argüman içeren bir Konu oluşturmak istiyorum. Mümkün mü? Ben fonksiyonlara sahiptir:NSThread sayısıyla ilgili iki bağımsız değişkenli arama seçici

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

Ve bir seçici olarak bu işlevi çağırmak istiyorum:

 

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


Bu nasıl detachNewThreadSelect fonksiyonu üzerine withObject parametresine iki argüman geçmek?

Mümkün mü?

cevap

16

Öyle gibi withObject geçirilen bir nesne ilave parametreler geçirmeniz gerekebilir:

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

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

teşekkürler. – iPadDeveloper2011

+0

İlk satırın sonunda noktalı virgülü unuttun ;-) – Ken

0

yardımcı bir sarma yöntemi ile Seçtiğiniz yöntemi sarın, "wrappingMethod", girdilerin bir NSArray işler senin uyacak Kendi yöntemini wrappingMethod içinde aramadan önce kendi yöntemi. Şimdi tüm yeni wrappingMethod'u seçen ve withObject için NSArray örneğini alan bir NSThread'i ayırın.

Yanında: Bir sarıcıya sahip olmak, özgün yönteminiz bir veya daha fazla ilkel türü giriş olarak alırsa ve daha sonra NSNumber veya NSStrings ile çalışmanız gerekiyorsa, NSThread'i tatmin etmek için özellikle yararlı olabilir.

@interface NSThread (ManyObjects) 

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

@end 

NSThread+ManyObjects.m:

NSThread+ManyObjects.h:

6

Bu, başımın üstü kapalı test edilmedi

@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 

Ve sonra NSThread+ManyObjects içe ve çağırabilir

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

ennuikiller en güzel cevabı bir güncelleme: Bu soru @Lance için büyük bir cevap için

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

[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:params]; 
İlgili konular