2016-08-01 11 views
0
-(NSDictionary *)fetchFromUrl:(NSString *)url{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
             completionHandler: 
           ^(NSData *data, NSURLResponse *response, NSError *error) { 
            dataFetched = [NSJSONSerialization JSONObjectWithData:data 
                          options:0 
                          error:NULL]; 

           }]; 
    [task resume]; 
    NSLog(@"dataFetched, %@", dataFetched); 

    return dataFetched; 
} 

Also versuchte ich setzen die dataFetched als globale Variable bekommen, so konnte ich es um meine .m-Datei zugreifen und sie zugänglich zu anderen .m-Datei machen, aber als ich versuchte, die dataFetched zu NSLog aus anderen .m-Datei es ausgibt (null). Kann ich die Daten in meinen anderen .m-Dateien, die die Daten benötigen, trotzdem zugänglich machen?Wie NSDictionary von NSURLSessionDataTask

Antwort

1

Sie müssen Block mit Ihrer Methode verwenden, anstatt NSDictionary zurückzugeben, also ändern Sie Ihren Code wie folgt.

erste Änderung Ihrer Methode wie diese

-(void)fetchFromUrl:(NSString *)url withDictionary:(void (^)(NSDictionary* data))dictionary{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
    NSURLSession *session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
              completionHandler: 
            ^(NSData *data, NSURLResponse *response, NSError *error) { 
             NSDictionary *dicData = [NSJSONSerialization JSONObjectWithData:data 
                        options:0 
                         error:NULL]; 
             dictionary(dicData); 
            }]; 
    [task resume];   
} 

Jetzt ist Ihre Methode, wie diese

nennen
[self fetchFromUrl:urlStr withDictionary:^(NSDictionary *data) { 
    self.dataFetched = data; 
    NSLog(@"data %@",data); 
}]; 
+0

hat es funktioniert! aber wie funktioniert das (void (^) (NSDictionary * data) -Wörterbuch? – jane

+0

Sie machen einen API-Aufruf und das funktioniert im Hintergrund (async), und die Funktion, die Sie mit 'NSDictionary' deklarieren, arbeitet synchron. Deshalb erhalten Sie, wenn Sie die Antwort erhalten, das leere wo als Block in asynchroner Weise arbeiten. –

+0

Okay, es hat funktioniert, aber wie soll ich auf die Datenwerte zugreifen? Ich habe versucht mit __block, aber es immer noch nicht die Werte. – jane

0

Wenn Sie Ihren NSDictionary innerhalb des Blocks ändern Sie __block Attribut für Ihre Immobilie wie unten

@property (nonatomic, strong) __block NSDictionary *dataFetched; 

Blick auf doc

Verwenden __block Variablen deklarieren müssen Speicher teilen, wenn Sie in der Lage sein müssen, zu ändern Sie den Wert einer erfassten Variablen aus einem Block, können Sie den Modifikator __block Speichertyp auf die ursprüngliche Variable decl Vernunft. Dies bedeutet, dass die Variable im Speicher lebt, der zwischen dem lexikalischen Geltungsbereich der ursprünglichen Variablen und allen Blöcken ist, die innerhalb dieses Bereichs deklariert wurden.

+0

in Ordnung, also warum ich __block hinzufügen müssen? – jane

+0

Es tut mir leid, dass ich den __block aber noch null hinzugefügt habe ... – jane