Antwort

0

Es ist ein bisschen schwer zu verstehen, was Sie suchen, aber diese könnte es sein. Dies ist, wie ich Fertigstellung Rückrufe in meiner app Griff:

@import Foundation; 

typedef void (^CompletionBlock)(NSArray *data); 

@interface TheClass() 

@property (nonatomic, copy) CompletionBlock *myCompletion; 

@end 

@implementation TheClass() 

// .... 


- (void) createOrderWithsuccess:(CompletionBlock)success { 
    _myCompletion = success; 
} 

-(void)listeners { 
    [[SocketIOManager sharedInstance].socket on:@"someAction" callback:^(NSArray* data, SocketAckEmitter* ack) { 
     // data received 
     _myCompletion(data); 

    }]; 
} 

// Alternatively, breaking possible retain cycles 
-(void)listeners { 
    __weak TheClass *weakSelf = self; 
    [[SocketIOManager sharedInstance].socket on:@"someAction" callback:^(NSArray* data, SocketAckEmitter* ack) { 
     // data received 
     if(weakSelf.myCompletion) weakSelf.myCompletion(data); 
    }]; 
} 

Die typedef in der H-Datei sein sollte, so dass beide diese Klasse und der einen Aufruf createOrderWithsuccess: weiß davon.

+0

nicht woking. Ich habe ERROR ** EXC_BAD_ACCESS (Code = 1, Adresse = 0xc) ** in dieser Zeile '_myCompletion (Daten);' –

+0

gut haben Sie 'createOrderWithSuccess:' zuerst aufgerufen? Sie könnten den Aufruf an _myCompletion (data) in einer if-Klausel umbrechen: 'if (_myCompletion) _myCompletion (data)'. – Joakim

+0

danke, es funktioniert :) muss ich 'if (_myCompletion) hinzufügen _myCompletion (Daten) _myCompletion = nil;'? Laut hanh answer.With '_myCompletion = nil' wird es nur einmal funktionieren. Ich kann _myCompletion = nil nicht einstellen, weil der Listener mehrere Male anrufen wird. –

0

Wenn ich Ihre Absicht richtig verstehe, ist die Idee in Ordnung. Anrufer können die Methode createOrderWithsuccess: als Setter für einen Abschlussblock verwenden. Anschließend rufen Anrufer listeners mit dem Verständnis auf, dass der Block, den sie zuvor festgelegt haben, bei Erfolg aufgerufen wird.

Es ist in Ordnung, aber ein paar Dinge berücksichtigen: (1) Kopieren Sie den Block ...

@property (nonatomic, copy) void (^myCompletion)(NSArray *); 

(1,5) Der Block besser „successHandler“ oder so ähnlich genannt werden würde, und die Eigenschaft könnte veröffentlicht werden, so dass Sie den createOrderWithsuccess: Setter löschen können.

(2) Da Sie nicht sicher sind, ob der Anrufer den Block gesetzt hat, für null überprüfen vor dem Aufruf (es ist ein Absturz sonst)

if (self.myCompletion) self.myCompletion(data); 

(3) nil den Block, nachdem Sie fertig sind damit. Wenn der Block auf dieses Objekt verweist, wird der Haltezyklus unterbrochen.

if (self.myCompletion) self.myCompletion(data); 
self.myCompletion = nil; 
+0

wie "createOrderWithsuccess" aussehen sollte? –

+0

Wenn der Block eine Eigenschaft ist, können Sie ihn als öffentliche Eigenschaft definieren, und Anrufer können sie direkt zuweisen. Wenn Sie die Zuweisung wirklich in createWithSuccess einfügen möchten, dann ist eine Ein-Zeilen-Zuweisung genau so, wie Sie es haben, wenn es in Ordnung ist. – danh

Verwandte Themen