سؤال

للطريقة:

[NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:(id)SELECTOR];

كيف يمكنني تمرير في الموقع حاولت إلقاءها على (معرف) لجعلها تجميعها، لكنها تعطل في وقت التشغيل.


وبشكل أكثر تحديدا، لدي طريقة مثل هذا:

+(void)method1:(SEL)selector{
[NSThread detachNewThreadSelector:@selector(method2:) toTarget:self withObject:selector];   
}

انه يتعطل. كيف يمكنني تمرير في المحدد دون تعطل، بحيث يمكن أن يسمي الخيط الجديد استدعاء المحدد عندما يكون الموضوع جاهزا؟

هل كانت مفيدة؟

المحلول

لا تتجاوز المشكلة هنا تحديد محدد إلى طريقة، في حد ذاتها، ولكن تمرير محدد حيث من المتوقع كائن. لتمرير قيمة غير كائن ككائن، يمكنك استخدامها NSValue. وبعد في هذه الحالة، ستحتاج إلى إنشاء طريقة تقبل NSVALUE وتسترجع المحدد المناسب. فيما يلي تطبيق مثال:

@implementation Thing
- (void)method:(SEL)selector {
    // Do something
}

- (void)methodWithSelectorValue:(NSValue *)value {
    SEL selector;

    // Guard against buffer overflow
    if (strcmp([value objCType], @encode(SEL)) == 0) {
        [value getValue:&selector];
        [self method:selector];
    }
}

- (void)otherMethodShownInYourExample {
    SEL selector = @selector(something);
    NSValue *selectorAsValue = [NSValue valueWithBytes:&selector objCType:@encode(SEL)];
    [NSThread detachNewThreadSelector:@selector(methodWithSelectorValue:) toTarget:self withObject:selectorAsValue];
}
@end

نصائح أخرى

يمكنك التحويل بين محددات وكائنات السلسلة باستخدام NSStringFromSelector() و NSSelectorFromString() المهام. لذلك يمكنك فقط تمرير كائنات السلسلة بدلا من ذلك.

بالتناوب، إذا كنت لا ترغب في تغيير طرقك، فيمكنك إنشاء NSInvocation لإنشاء استدعاء لاستدعاء الأسلوب الخاص بك (نظرا لأنه يمكن إعداد الدعوات مع حجج غير كائن)، ثم الاتصال به [NSThread detachNewThreadSelector:@selector(invoke) toTarget:myInvocation withObject:nil];

استخدام NSValue، مثل ذلك:

+(void)method1:(SEL)selector {
    NSValue *selectorValue = [NSValue value:&selector withObjCType:@encode(SEL)];
    [NSThread detachNewThreadSelector:@selector(method2:) 
                             toTarget:self 
                           withObject:selectorValue];
}

يهدف NSValue كجهاز غلاف كائن لأنواع غير تعسفية غير كائنات.

إذا كنت لا ترغب في تحديد كائن يستخدم فقط NIL.

[NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:nil];

إذا كنت بحاجة إلى اجتياز كائن إلى محدد، فستبدو شيئا كهذا.

أنا هنا اجتياز سلسلة إلى طريقة "Settext".

NSString *string = @"hello world!";
 [NSThread detachNewThreadSelector:@selector(setText:) toTarget:self withObject:string];


-(void)setText:(NSString *)string {
    [UITextField setText:string]; 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top