calling selector with two arguments on NSThread issue

元气小坏坏 提交于 2019-12-03 19:25:04

问题


I'd like to make a Thread with multiple arguments. Is it possible? I have the function:

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

And I want to call this function as a selector:


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


How to pass two arguments on withObject parameter on this detachNewThreadSelect function?

Is it possible?


回答1:


You need to pass the extra parameters in an object passed to withObject like so:

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

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



回答2:


This is off the top of my head, untested:

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

And then you can import NSThread+ManyObjects and call

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



回答3:


Wrap your selected method with an auxiliary wrapping method, "wrappingMethod", that processes an NSArray of inputs to suit your own method before calling your own method within wrappingMethod. Now detach an NSThread that selects your all new wrappingMethod and takes the NSArray instance for withObject.

Aside: Having a wrapper here can be particularly helpful if your original method takes one or more primitive types as input and you then have to work with NSNumber or NSStrings, say, to satisfy NSThread.




回答4:


An update to ennuikiller's nice answer:

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

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


来源:https://stackoverflow.com/questions/2327617/calling-selector-with-two-arguments-on-nsthread-issue

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!