вызов селектора с двумя аргументами по вопросу NSThread - PullRequest
15 голосов
/ 24 февраля 2010

Я бы хотел создать поток с несколькими аргументами. Является ли это возможным? У меня есть функция:

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

И я хочу вызвать эту функцию как селектор:


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


Как передать два аргумента с параметром withObject этой функции detachNewThreadSelect?

Возможно ли это?

Ответы [ 4 ]

16 голосов
/ 24 февраля 2010

Вам необходимо передать дополнительные параметры в объект, переданный withObject, например:

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

[NSThread detachNewThreadSelector:@selector(loginWithUser:) toTarget:self withObject:extraParams]; 
6 голосов
/ 14 декабря 2011

Это не в моей голове, не проверено:

NSThread+ManyObjects.h * * 1004

@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 голосов
/ 28 ноября 2014

Обновление красивого ответа ennuikiller:

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

[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:params];
0 голосов
/ 25 октября 2010

Оберните выбранный метод вспомогательным методом обертывания "wrappingMethod", который обрабатывает NSArray входных данных в соответствии с вашим собственным методом перед вызовом вашего собственного метода в wrappingMethod. Теперь отсоедините NSThread, который выбирает все ваши новые wrappingMethod и принимает экземпляр NSArray для withObject.

В сторону: наличие обертки здесь может быть особенно полезно, если ваш оригинальный метод принимает один или несколько примитивных типов в качестве входных данных, и вам затем приходится работать с NSNumber или NSStrings, скажем, чтобы удовлетворить NSThread.

...