Wie bekomme ich Daten aus Blöcken mit NSURLSession?
Ich habe ein problem mit diesem block. Ich versucht, um die Daten in den block, der NSURLSession
.
hier ist mein code
-(NSDictionary *) RetrieveData{
NSURLSession * session = [NSURLSession sharedSession];
NSURL * url = [NSURL URLWithString: self.getURL];
dataList =[[NSDictionary alloc] init];
NSURLSessionDataTask * dataTask = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
self.json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
}];
return self.dataList;
[dataTask resume];
}
Ist es auch möglich, die Daten innerhalb der Blöcke von NSURLSession
?
- Sind Sie versuchen, zu verwenden die JSON-außerhalb des Blocks? Dieser block wird asynchron ausgeführt, so trifft man auf die folgenden Zeilen
[dataTask resume]
auch vor dem block ausführt, die die JSON-parsing statt. - hi @Rob ich update meinen post. Ja ich will die json-Daten zu erhalten, die von block-und zurück in meine Methode.
- Sie nicht. Wenn Sie möchten, übergeben Sie es zurück, müssen Sie beschäftigen eine Fertigstellung block-Muster.
- Es immer noch null zurückgeben, Wenn ich diese Methode
- Sie sollten nicht alles zurückzugeben, was von dieser Methode (oder vielleicht auch nur die
NSURLSessionDataTask
Zeiger). Sie übergeben die Daten wieder in ein Abschluss-block, z.B. stackoverflow.com/a/26107818/1271826
Du musst angemeldet sein, um einen Kommentar abzugeben.
nennen das:
Sollten Sie ein Abschluss-block, z.B.:
Dann die Methode aufruft, das würde bedeuten:
Du bist Aufruf einer asynchronen Methode beschäftigt, dass ein Abschluss block-Muster, so sollten Sie beschäftigen auch die Fertigstellung block-Muster in Ihrem eigenen code.
NSURLSession
Methoden, die es eigentlich fordert Sie es auf einem hintergrund-thread. Aber da alle UI-code muss statt, auf dem Haupt-thread, dassdispatch_async
code sagt, "das, was innerhalb dieses Blocks wird entsandt, um den Haupt-thread". Ich weiß, es ist viel zu nehmen, aber wieder, es wird zu einem Muster werden Sie vertraut mit, wie Sie tun, mehr und mehr Kakao-Programmierung.Müssen Sie Ihren Kopf um diese Methode. Am besten, Sie benennen Sie die Methode RetrieveData (Sie sind in Verletzung von Kakao Namenskonventionen hier) zu startRetrievingData. Sie nicht schreiben können eine Methode auch tatsächlich das abrufen der Daten, denn das kann einige Minuten in Anspruch nehmen, im schlimmsten Fall, und Ihre Benutzer werden Euch hassen.
Nennen es startRetrievingData, machen es void zurück, und übergeben Sie in zwei Blöcke, wenn die aufgerufen wird, werden in der Zukunft, wenn die Daten abgerufen wurden, und eine, die wird in Zukunft aufgerufen, wenn ein Fehler passiert ist, und Sie können nicht die Daten.
Können Sie nicht zurück der Daten. Fragen Sie nicht "wie kann ich die Daten zurückgeben", Sie können es einfach nicht. Geben Sie den code ein block, der aufgerufen wird, wenn Daten verfügbar sind, und , dass block ist verantwortlich für das tun mit den Daten, was Sie wollen zu tun.