2010-02-24 14 views
15

मैं एकाधिक तर्कों के साथ एक थ्रेड बनाना चाहता हूं। क्या यह संभव है? मैं समारोह है:एनएसटीएचड मुद्दे पर दो तर्कों के साथ चयनकर्ता चयनकर्ता

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

और मैं एक चयनकर्ता के रूप में इस समारोह कॉल करना चाहते हैं:

 

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


यह कैसे detachNewThreadSelect समारोह पर withObject पैरामीटर पर दो तर्क पारित करने के लिए?

क्या यह संभव है? कि आदानों की एक NSArray प्रक्रियाओं अपने सूट करने के लिए

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

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

उत्तर

16

आप एक वस्तु पारित कर में अतिरिक्त पैरामीटर पारित करने के लिए तो जैसे withObject करने की जरूरत है wrappingMethod के भीतर अपनी खुद की विधि को कॉल करने से पहले स्वयं की विधि। अब एक एनएसटीएचएड को अलग करें जो आपके सभी नए wrappingMethod का चयन करता है और withObject के लिए एनएसएआरएआरई उदाहरण लेता है।

एक तरफ: अपने मूल विधि एक लेता है या इनपुट के रूप में अधिक आदिम प्रकार और आप तो NSNumber या NSStrings, कहते हैं के साथ काम करना, NSThread को संतुष्ट करने के लिए है, तो यहाँ एक आवरण होने विशेष रूप से उपयोगी हो सकता है।

+0

इस सवाल @Lance के लिए एक महान जवाब के लिए धन्यवाद। – iPadDeveloper2011

+0

आप अपनी पहली पंक्ति के अंत में अर्धविराम भूल गए ;-) – Ken

0

एक सहायक रैपिंग विधि के साथ अपने चुने हुए विधि लपेटें, "wrappingMethod",:

6

यह मेरे सिर के ऊपर से है, अपरीक्षित:

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 

और फिर आप NSThread+ManyObjects आयात और कॉल कर सकते हैं

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

ennuikiller के अच्छा जवाब देने के लिए एक अद्यतन:

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

[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:params]; 
संबंधित मुद्दे