2016-04-24 5 views
0

Nachdem für diese Art von Fehlern suchen:Wie auf eine Variable innerhalb des Blocks von ID-Typ in Objective-C zugreifen?

Variable is not assignable (missing __block type specifier)

fand ich die folgende Lösung Assign a variable inside a Block to a variable outside a Block und nachdem ich über die __block gelesen von der akzeptierten Antwort und mein Code konnte ich nicht anderes Szenario profitieren. Hier

ist der Code, den ich verwende:

NSDictionary *strongUser = [[NSDictionary alloc]init]; 
__block NSDictionary *user = strongUser; 

NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; 
[parameters setValue:@"id, name, email" forKey:@"fields"]; 
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] 
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
     user = result; 
}]; 

NSLog(@"%@",user); 

NSLog Druck nichts

Was ich will, ist angesichts der Ergebniswert Variable außerhalb des Blocks auf extern.

enter image description here

+0

Was ist mit Ihrem Abschluss-Handler, haben Sie fertig? –

+0

mein Abschluss-Handler fertig –

+0

Ok, und 'Ergebnis' Parameter ist was Sie wollen? –

Antwort

0

würde ich __block NSDictionary *strongUser mit vorschlagen. Ich bin besorgt, dass der Zeiger user immer noch innerhalb des Blocks existiert, aber die zugrunde liegende Variable, auf die er zeigt, ist möglicherweise nicht mehr zugänglich. Zum Beispiel:

__block NSDictionary *strongUser = [[NSDictionary alloc]init]; 

NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; 
[parameters setValue:@"id, name, email" forKey:@"fields"]; 
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] 
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
{ 
    strongUser = result; 
}]; 
+0

können Sie eine detaillierte Antwort liefern? –

+0

Ich habe versucht, Ihre Lösung das gleiche Problem persistent –

0

Fügen Sie den folgenden innerhalb Ihr Block:

NSLog(@"Doing assignment inside the block"); 

dann Ihren Code ausführen.

Die Antwort auf Ihre Frage wird offensichtlich sein.

HTH

+0

Ich konnte nicht verstehen, was Sie versuchen zu sagen –

+0

In welcher Reihenfolge drucken die beiden Protokollanweisungen, wenn Sie Ihren Code ausführen? – CRD

+0

das Protokoll außerhalb des Blocks vor dem Inneren des Blocks ausgeführt, weiß ich, aber ich möchte eine Lösung –

0

Sie führen Ihr Code async und Ihre Log-Auswertung vor dem Abschluss-Handler.
Fügen Sie Ihr Protokoll direkt in den Bereich des Abschluss-Handlers ein.

NSDictionary *strongUser = [[NSDictionary alloc]init]; 
__block NSDictionary *user = strongUser; 

NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; 
[parameters setValue:@"id, name, email" forKey:@"fields"]; 
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] 
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
{ 
    user = result; 

    NSLog(@"%@",user); 
}]; 
+0

ja schon lesen Sie dies auf https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.htm#//apple_ref/doc/uid/TP40007502-CH6-SW6 aber wie Ich kann mein Problem lösen –

+0

Siehe mein aktuelles Code-Snippet. –

+0

das Protokoll innerhalb des Blocks geben Sie mir das Ergebnis, aber was ich auf diesen Wert außerhalb des Blocks zugreifen möchten –

0

Sie haben eine lokale Variable strongUser, bedeutet dies, dass, wenn dieser Bereich (Funktion) abgeschlossen sein wird, wird Ihre lokale Variable strongUser freigegeben werden - so, wenn Ihr Block arbeitet __block variavle Benutzer am Leben ist, aber es weist auf Unexist Objekt.

Die einfache wasy es richtig zu implementieren ist eine Eigenschaft mit faulen Setter zu erstellen:

@property (nonatomic, strong) NSDictionary *strongUser; 

- (NSDictionary *)strongUser { 
    if (!_strongUser) { 
     _strongUser = [[NSDictionary alloc] init]; 
    } 
    return _strongUser; 
} 

Und es mit selfinside Block nennen:

NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; 
    [parameters setValue:@"id, name, email" forKey:@"fields"]; 

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me"parameters:parameters] 
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
    self.strongUser = result; 
    NSLog(@"%@",self.strongUser); 
    }]; 

Hoffe, es hilft!

+0

Das gleiche Problem persist: S –

+0

@ ZakariaDarwish Sie erhalten nicht den Wert des Ergebnisses in NSLog auf der letzten Zeile, weil es früher als Abschluss Block arbeitet. Der Wert des Ergebnisses wird nach dem Abschluss in "StonUser" festgelegt. –

+0

können Sie mir sagen, wie Sie wissen, wann die Fertigstellung abgeschlossen sein wird –

Verwandte Themen