Wie kann ich ein Block
an ein Function
/ übergeben Method
?
Ich versuchte es - (void)someFunc:(__Block)someBlock
ohne Erfolg.
dh. Was ist der Typ für ein Block
?
objective-c
objective-c-blocks
Jacksonkr
quelle
quelle
Antworten:
Der Typ eines Blocks hängt von seinen Argumenten und seinem Rückgabetyp ab. Im allgemeinen Fall werden Blocktypen genauso deklariert wie Funktionszeigertypen, jedoch durch
*
a ersetzt^
. Eine Möglichkeit, einen Block an eine Methode zu übergeben, ist folgende:Aber wie Sie sehen können, ist das chaotisch. Sie können stattdessen a verwenden
typedef
, um Blocktypen sauberer zu machen:Und dann übergeben Sie diesen Block an eine Methode wie folgt:
quelle
NSNumber *
oderstd::string&
oder irgendetwas anderes übergeben, das Sie als Funktionsargument übergeben könnten. Dies ist nur ein Beispiel. (Für einen Block, der mit Ausnahme des Ersatzes gleichwertig istid
mitNSNumber
dertypedef
wäretypedef void (^ IteratorWithNumberBlock)(NSNumber *, int);
.)NS_NOESCAPE
, aberenumerateObjectsUsingBlock
mir wurde gesagt, dass sie nicht ausgeblendet werden, aber ich seheNS_NOESCAPE
nirgendwo auf der Website etwas, und es wird in den Apple-Dokumenten überhaupt nicht erwähnt, dass es ausgeblendet wird. Kannst du helfen?Die einfachste Erklärung für diese Frage ist die Befolgung dieser Vorlagen:
1. Block als Methodenparameter
Vorlage
Beispiel
Andere Verwendung von Fällen:
2. Als Eigenschaft blockieren
Vorlage
Beispiel
3. Blockieren Sie als Methodenargument
Vorlage
Beispiel
4. Block als lokale Variable
Vorlage
Beispiel
5. Als typedef blockieren
Vorlage
Beispiel
quelle
Dies könnte hilfreich sein:
quelle
Sie können dies tun, indem Sie den Block als Blockparameter übergeben:
quelle
Eine weitere Möglichkeit, den Block mit den Funktionen с im folgenden Beispiel zu übergeben. Ich habe Funktionen erstellt, um alles im Hintergrund und in der Hauptwarteschlange auszuführen.
blocks.h Datei
blocks.m Datei
Als import blocks.h wenn nötig und rufen Sie es auf:
quelle
Sie können Block auch als einfache Eigenschaft festlegen, wenn dies für Sie gilt:
Stellen Sie sicher, dass die Blockeigenschaft "copy" ist!
und natürlich können Sie auch typedef verwenden:
quelle
Außerdem rufen Sie einen Block mit der üblichen c-Funktionssyntax auf oder rufen ihn auf
Mehr Infos zu Blöcken hier
http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1
quelle
Ich neige immer dazu, die Blocksyntax zu vergessen. Das fällt mir immer ein, wenn ich einen Block deklarieren muss. Ich hoffe es hilft jemandem :)
http://fuckingblocksyntax.com
quelle
Ich habe einen CompletionBlock für eine Klasse geschrieben, die die Werte der Würfel zurückgibt, nachdem sie geschüttelt wurden:
Definieren Sie typedef mit returnType (
.h
obige@interface
Deklaration)Definiere a
@property
für den Block (.h
)Definieren Sie eine Methode mit
finishBlock
(.h
)Insert vorherige definierte Methode in
.m
Datei und verpflichtenfinishBlock
zu@property
definiert vorUm
completionBlock
einen vordefinierten variablen Typ an ihn auszulösen (Vergessen Sie nicht zu prüfen, ob dercompletionBlock
vorhanden ist)quelle
Trotz der Antworten in diesem Thread hatte ich wirklich Mühe, eine Funktion zu schreiben, die einen Block als Funktion verwendet - und zwar mit einem Parameter. Hier ist schließlich die Lösung, die ich gefunden habe.
Ich wollte eine generische Funktion schreiben
loadJSONthread
, die die URL eines JSON-Webdienstes verwendet, einige JSON-Daten von dieser URL in einen Hintergrundthread lädt und dann ein NSArray * der Ergebnisse an die aufrufende Funktion zurückgibt.Grundsätzlich wollte ich die gesamte Komplexität des Hintergrund-Threads in einer generischen wiederverwendbaren Funktion verbergen.
So würde ich diese Funktion nennen:
... und das ist das Bit, mit dem ich zu kämpfen hatte: wie man es deklariert und wie man es dazu
Block
bringt, die Block-Funktion aufzurufen, sobald die Daten geladen wurden, und das NSArray * der geladenen Datensätze zu übergeben:Diese StackOverflow-Frage betrifft das Aufrufen von Funktionen, wobei ein Block als Parameter übergeben wird. Daher habe ich den obigen Code vereinfacht und die
loadJSONDataFromURL
Funktion nicht eingeschlossen .Wenn Sie interessiert sind, finden Sie eine Kopie dieser JSON-Ladefunktion in diesem Blog: http://mikesknowledgebase.azurewebsites.net/pages/Services/WebServices-Page6.htm
Hoffe das hilft einigen anderen XCode Entwicklern! (Vergessen Sie nicht, diese Frage und meine Antwort abzustimmen, wenn dies der Fall ist!)
quelle
Die vollständige Vorlage sieht aus wie
quelle