Ist es nicht möglich, Abschlussblock-Erfolg zu erhalten, dann Daten von einer anderen Methode erhalten?Wie Ausführen Vervollständigungsblock von einer anderen Methode in Objective-c?
Antwort
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.
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;
wie "createOrderWithsuccess" aussehen sollte? –
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
- 1. Swift Pass-Array nach ObjectiveC-Methode
- 2. Verwenden eines Rückgabewerts von einer Methode in einer anderen Methode
- 3. TestNG-Test von einer anderen Klasse ausführen
- 4. Ausführen einer Methode einer anderen Klasse in dieser anderen Klasse wpf
- 5. ObjectiveC - wie NSUserNotification Kennung Eigenschaft
- 6. AMF0 Parser in ObjectiveC
- 7. Rückkehr von einer Schleife von einer anderen Methode
- 8. Aufruf einer Methode auf einer Karte von einer anderen Methode
- 9. Ausführen der Konsolenanwendung von einer anderen Konsolenanwendung
- 10. Ausführen von Doctests mit einer anderen Funktion
- 11. Umleiten von einer Controller-Methode zu einer anderen Controller-Methode
- 12. ObjectiveC - Freigabe von Objekten als Parameter
- 13. Was entspricht einem Swift-Vervollständigungsblock in Python?
- 14. Ausführen einer anderen Anwendung von Java
- 15. Call-Methode von einer anderen Methode in Ember Service
- 16. Wie man Methode von einer anderen Klasse anruft
- 17. Wie kann ich testNG über einen Aufruf von einer anderen Methode ausführen, sagen wir eine Hauptmethode?
- 18. Ausführen von Methoden aus einer anderen Klasse in Java
- 19. Swift Framework in ObjectiveC Projekt
- 20. Zugriff auf Ergebnisse von einer anderen Methode
- 21. Wie Unterklasse eine Klasse in ObjectiveC korrekt?
- 22. Call-Methode von einer anderen Aktivität
- 23. jquery-Methode in einer anderen Datei nicht
- 24. Lese von einer anderen Methode aus
- 25. Eine Schleife von einer anderen Methode brechen
- 26. reloadData Methode nicht von einer anderen Klasse
- 27. Block von einer Methode zur anderen übergeben
- 28. Run sollteAutorotateToInterfaceOrientation von einer anderen Methode?
- 29. React Ausführen einer Methode innerhalb einer Komponente
- 30. ObjectiveC - Anzeigefenster durch verteilte Objekte
nicht woking. Ich habe ERROR ** EXC_BAD_ACCESS (Code = 1, Adresse = 0xc) ** in dieser Zeile '_myCompletion (Daten);' –
gut haben Sie 'createOrderWithSuccess:' zuerst aufgerufen? Sie könnten den Aufruf an _myCompletion (data) in einer if-Klausel umbrechen: 'if (_myCompletion) _myCompletion (data)'. – Joakim
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. –