2016-06-02 2 views
0

Wenn ich den folgenden Code:Firebase und iOS: Kann Variable in Block zurückzukehren trotz ich die __block Bezeichner verwenden

(int) function{ 
__block int count = 0; 

[[[_ref child:@“lambda”] child:serial] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { 
    // Get user value 
    count++; 

    NSLog(@“Inside: %i", count); 
} withCancelBlock:^(NSError * _Nonnull error) { 
}];; 

NSLog(@“Outside: %i", count); 
return count; 
} 

ich folgende Ausgabe:

Innen: 1 Außen : 0

und wenn ich es als eine Funktion gibt die Funktion 0 und nicht 1 nennen.

  • Ich bin mit der __block Kennung aber trotz, dass der Variable nicht geändert zu bleiben scheint. Warum?

  • Wie kann ich die Funktion 1 zurückgeben, wenn der Inside-Wert 1 ist?

+0

Sie sind verwirrt über asynchrone und synchrone Ausführung von Code. Dieser Block wird * einige Zeit später * ausgeführt, während der äußere 'NSLog()' sofort ausgeführt wird. – Droppy

Antwort

0

Der Ausgang ist korrekt. Wenn Sie diesen Code debuggen, wird zuerst wit ausführen (so wird dies 0 drucken) und dann NSLog(@“Inside: %i", count); (so wird dies 1 drucken).

Aktualisiert Antwort aktualisiert Frage:

Mit dem Inneren Wert von count Sie die Ausführung von Code ausführen möchten. Übergeben Sie diesen Code als Block an das Funktionsargument. -Code wird so etwas wie unten sein:

-(void) functionwithCompletionHandler:(void (^)(void)completionHandler : { 
    _block int count = 0; 

[[[_ref child:@“lambda”] child:serial] observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { 
// Get user value 
count++; 
completionHandler(); 
NSLog(@“Inside: %i", count); 
} withCancelBlock:^(NSError * _Nonnull error) { 
}];; 


} 

Siehe Link unten für weitere Informationen über Block: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

+0

Danke, ich habe einige zusätzliche Details hinzugefügt. Würdest du sie überprüfen können? – mm24

+0

Diese Antwort erklärt nicht, warum * das Innere 'NSLog()' nach dem Äußeren aufgerufen wird. – Droppy

Verwandte Themen