2016-06-22 7 views
0

Sagen, ich habe einen Selektor durchführen:direkt einen Selektor auf ein Objekt

(SEL)aSelector 

und ich habe ein Objekt MyObj.

Die aSelector stellt eine Funktion dar, die in der Klasse MyObj definiert ist.

Wie kann ich den Selektor aufMyObjausführen?

(I in NSObject Klasse gefunden, gibt es eine Funktion ist:

- performSelector:onThread:withObject:waitUntilDone:

Aber es passt nicht, was ich brauche, da der withObject: Teil auf die Auswahlfunktion dort steht, ein Parameter übergeben aber was ich brauche, ist zu Selektor Nachricht an diesen myObj)

senden ===== Warum ich & fragen, was ich ===

erreichen wollen

Ich möchte eine allgemeine Funktion haben, die einen Selector-Typ-Parameter akzeptiert und ein Objekt, auf dem der Selektor ausgeführt werden soll. In diesem allgemeinen Funktion Körper, verwende ich Dispatch Gruppe diesen Selektor auf dem Objekt auszuführen und für die Auswahlfunktion vollständig warten, meinen Code-Schnipsel:

-(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. 
    }); 
} 

KLARSTELLUNG:

Ich mag ausführen der Selektor auf myObj, wie ich oben erwähnt habe. Die Klasse myObj ist auch eine Unterklasse von NSThread, und ich möchte, dass der Selektor in diesem Thread ausgeführt wird. Insgesamt möchte ich, dass der Selektor an myObj und an myObj Thread ausgeführt wird. Das ist alles.

+1

Können Sie etwas genauer erklären, was Sie erreichen möchten? – Zartha

+0

@Zartha, siehe mein Update. –

+0

Sie wollen also nur eine Methode ohne Argumente aufrufen? Übergeben Sie dann "nil" in den Parameter 'withObject:'. Ich bin mir nicht sicher, ob ich alles verstehe, was du verlangst. – Hamish

Antwort

0

Sie können versuchen, diese In MyObj.h

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

In MyObj.m

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

Jetzt in Ihrem allgemeine Funktion tun, um diese

-(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. 
}); 
} 

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

+0

Ich bekomme "undefined selector" Fehler beim Aufruf meiner allgemeinen Funktion, weil ich von einer anderen Klasse nicht von MyObj Klasse aufrufen. Wie man es los wird? –

+0

Egal von wo aus Sie anrufen, sollte funktionieren. Kannst du deinen Code posten, wie rufst du den Kommentar an? – Zartha

+0

Ich nenne es so '[self myGeneralFuncWithObject: myObj andSelector: @ (doTask :) mitArgument: (NSString *) name]', der 'doTask: (NSString *) name' ist eine in myObj-Klasse definierte Funktion. –

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 

wenn ich das richtig verstehen

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

'[myObj performSelector: aSelector withObject: myObj];' fragt man sich, warum Sie myObj als Argument an den Selektor übergeben? –

+0

@ Leem.fin, in diesem Fall für die Klarheit und Beispiel. –

+0

@ Leem.fin, als ein Parameter (myObj) könnte jede andere Objektklasse mit einem Selektor (aSelector) –

0

Das also ist die Antwort für den Versuch, Wähler auf der MyObject durchzuführen, und dass MyObject ist Unterklasse von NSThread, und der Wähler auf diesem Thread ausführen soll. Ich hoffe, das ist es, was du meintest.

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

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