2016-06-22 3 views
0

Скажем, у меня есть селектор:непосредственно выполнить селектор на объекте

(SEL)aSelector 

и у меня есть объект MyObj.

aSelector представляет собой функцию, определенную в классе MyObj.

Как я могу выполнить селектор наMyObj?

(я нашел в классе NSObject, есть функция:

- performSelector:onThread:withObject:waitUntilDone:

Но это не подходит то, что мне нужно, так как withObject: часть там представляет параметр помещаемые в функцию селектора, но то, что мне нужно, чтобы отправить сообщение селектора в этом myObj)

===== Почему я спрашиваю & Что я хочу достичь ===

Я хочу иметь общую функцию, которая принимает параметр типа Selector и объект, на котором должен выполняться селектор. В этом общем теле функции, я использую диспетчерскую группу для выполнения этого выбора на объекте и ждать Дисплейного селектора, мой фрагмент коды:

-(void)myGeneralFuncWithObject:(NSObject*)myObj andSelector:(SEL)aSelector{ 
    ... 
    dispatch_group_async(group, queue, ^{ 
    // My question is how to write code to 
    // indicate performing aSelector on myObj here? 
    }); 

    dispatch_group_notify(group, queue, ^{ 
    // selector function finished here, I suppose. 
    }); 
} 

ПОЯСНЕНИЕ:

Я хотел бы выполнить селектор на myObj, как я уже говорил выше. Класс myObj также является подклассом NSThread, и я бы хотел, чтобы селектор выполнял эту тему. Итак, в целом, я хочу, чтобы селектор выполнялся по myObj и по потоку myObj. Вот и все.

+1

Не могли бы вы объяснить в деталях, чего вы пытаетесь достичь? – Zartha

+0

@ Zartha, см. Мое обновление. –

+0

Вы хотите просто вызвать метод без аргументов? Затем передайте 'nil' в параметр' withObject: '. Я не уверен, что полностью понимаю, о чем вы спрашиваете. – Hamish

ответ

0

Вы можете попробовать это В MyObj.h

-(void)mySelWithOneArgument:(MyObj*)argument; 

В MyObj.m

-(void)mySelWithOneArgument:(MyObj*)argument{ 
    //Do whateve 
} 

Теперь в вашей общей функции делают этот

-(void)myGeneralFuncWithObject:(NSObject*)myObj andSelector: 
(SEL)aSelector{ 
... 
dispatch_group_async(group, queue, ^{ 
     [myObj performSelector:aSelector withObject:myObj]; 
}); 

dispatch_group_notify(group, queue, ^{ 
// selector function finished here, I suppose. 
}); 
} 

И aSelector = @selector(mySelWithOneArgument:);//Dont forget the : at the end

+0

Я получаю ошибку «undefined selector» при вызове моей общей функции, потому что я звоню из другого класса, а не из класса MyObj. Как избавиться от него? –

+0

Независимо от того, где вы звоните, он должен работать. Можете ли вы опубликовать свой код, как вы звоните в комментарии? – Zartha

+0

Я называю это следующим: '[self myGeneralFuncWithObject: myObj andSelector: @ (doTask :) withArgument: (NSString *) name]', 'doTask: (NSString *) name' - это функция, определенная в классе myObj. –

0
@interface MyClass : NSThread 
-(void)myGeneralFuncWithObject:(MyClass*)myObj andSelector:(SEL)aSelector; 
@end 
@implementation MyClass 

- (void)myMethod:(MyClass *)object { 
    NSLog(@"%@", object); 
} 

-(void)myGeneralFuncWithObject:(MyClass*)myObj andSelector:(SEL)aSelector{ 
    if ([myObj respondsToSelector:aSelector]){ 
     [myObj performSelector:aSelector withObject:myObj]; 
    } else { 
     NSLog(@"Class not have selector"); 
    } 
} 

@end 

, если я правильно понимаю

MyClass *myClass = [[MyClass alloc] init]; 
    [myClass myGeneralFuncWithObject:myClass andSelector:@selector(myMethod:)]; 
+0

'[myObj performSelector: aSelector withObject: myObj];' один вопрос по этому вопросу, почему вы передаете myObj в качестве аргумента для селектора? –

+0

@ Leem.fin, в этом случае для ясности и примера. –

+0

@ Leem.fin в качестве параметра (myObj) может быть любым другим классом объектов, имеющим селектор (aSelector) –

0

Так что это ответ на попытку выполнить селектор на MyObject, и что MyObject является подклассом NSThread, и селектор должен выполнить по этой теме. Надеюсь, это то, что вы имели в виду.

-(void)myGeneralFuncWithObject:(NSObject*)myObj andSelector:(SEL)aSelector{ 

     NSThread *thread = (NSThread *)myObj; 
     [myObj performSelector:aSelector onThread:thread withObject:nil waitUntilDone:YES]; 
    }