16

複数の引数を持つスレッドを作りたいのですが。出来ますか?私は機能を持っています:

-(void)loginWithUser:(NSString *)ユーザーパスワード:(NSString *)パスワード{
}

そして、この関数をセレクターとして呼び出したいと思います。

[NSThread detachNewThreadSelector:@selector(loginWithUser:user:password :) toTarget:self withObject:@ "someusername" withObject:@ "somepassword"]; // これは間違っています


このdetachNewThreadSelect関数のwithObjectパラメーターに2つの引数を渡す方法は?

出来ますか?

4

4 に答える 4

16

次のように、 withObject に渡されるオブジェクトに追加のパラメーターを渡す必要があります。

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

[NSThread detachNewThreadSelector:@selector(loginWithUser:) toTarget:self withObject:extraParams]; 
于 2010-02-24T16:30:48.607 に答える
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"];
于 2011-12-14T09:07:13.123 に答える
1

ennuikiller の素敵な答えへの更新:

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

[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:params];
于 2014-11-28T13:59:08.753 に答える
0

wrappingMethod選択したメソッドを、内で独自のメソッドを呼び出す前に、独自のメソッドに合わせて入力の NSArray を処理する補助ラッピング メソッド " " でラップしますwrappingMethodwrappingMethod次に、すべての新しいものを選択し、 の NSArray インスタンスを取るNSThread を切り離しますwithObject

余談ですが、元のメソッドが入力として 1 つ以上のプリミティブ型を取り、NSThread を満たすために NSNumber または NSStrings を操作する必要がある場合、ここにラッパーがあると特に役立ちます。

于 2010-10-25T11:19:59.707 に答える