2013-07-14 15 views
12

ich AFNetworking bin mit Daten zu erhalten, die von einem Server:Rückgabewert für die Funktion in einem Block

-(NSArray)some function { 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
     success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
      NSArray *jsonArray =[JSON valueForKey:@"posts"]; 
     } 
     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {} 
} 

Also, was ich versuche, hier zu tun ist, um die jsonArray auf die Funktion zurückzukehren. Offensichtlich funktioniert die Rückgabe nicht.

+9

Sie können dies nicht tun. Da es sich um einen asynchronen Aufruf handelt, wird Ihre 'some function'-Methode zurückgegeben, lange bevor ein Wert zurückgegeben wird. – rmaddy

+2

Ich schlage vor, dass Sie einen Schritt zurückgehen und darüber nachdenken, was Ihr Code tut. Sie werden bald feststellen, dass das, was Sie wollen, keinen Sinn ergibt. –

+1

können Sie Blöcke zur Funktion übergeben, die bei Erfolg oder Fehler ausgeführt werden. – stosha

Antwort

19

Sie können den Abschlussblock nicht verwenden, um einen Rückgabewert für Ihre Methode zu erstellen. Die AFJSONRequestOperation funktioniert asynchron. someFunction wird zurückkehren, während der Vorgang noch läuft. Die Erfolgs- und Fehlerblöcke sind, wie Sie die resultierenden Werte erhalten, wo sie hin müssen.

Eine Option ist hier, den Aufrufer als Argument an Ihre Wrapper-Methode zu übergeben, damit der Completion-Block das Array ausgibt.

Sie könnten auch Ihren Anrufer erstellen und einen Block übergeben, der bei Erfolg ausgeführt werden soll. Dann muss goFetch: nicht mehr wissen, welche Eigenschaften auf dem Aufrufer existieren.

- (void)goFetch:(void(^)(NSArray *))completion 
{ 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
    success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
     if(completion) completion([JSON valueForKey:@"posts"]); 
    } 
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {} 
} 
+4

takeThisArrayAndShoveIt - lol für Methodenname –

3

Wie andere bereits gesagt haben, können Sie dies nicht tun, wenn Sie mit einem asynchronen Anruf arbeiten. Statt der erwarteten Array zurückzugeben, können Sie einen Abschluss Block als Parameter Dann

typedef void (^Completion)(NSArray* array, NSError *error); 

-(void)someFunctionWithBlock:(Completion)block { 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
     success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
      NSArray *jsonArray =[JSON valueForKey:@"posts"]; 
      if (block) block(jsonArray, nil); 
     } 
     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
      if (block) block(nil, error); 
     } 
} 

passieren, wo Sie das nennen somefunction. Dieser Code wird auch die richtige Fehlerbehandlung für Sie vornehmen.

[yourClassInstance someFunctionWithBlock:^(NSArray* array, NSError *error) { 
    if (error) { 
     NSLog(%@"Oops error: %@",error.localizedDescription); 
    } else { 
     //do what you want with the returned array here. 
    } 
}]; 
0

ich konfrontiert diese Art von Problem und löse es durch diese Methode unten. Ich sah die obigen Antworten mit Blöcken. Aber diese Lösung war zu dieser Zeit besser geeignet. Logik der Methode ist einfach. Sie müssen das Objekt und seine Methode als Parameter senden, und nach Anforderung wird diese Methode aufgerufen. Hoffe es hilft.

+(void)request:(NSString *)link parameters:(NSDictionary *)params forInstance:(id)instance returns:(SEL)returnValue 
{ 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    [manager GET:link 
     parameters:params 
     success:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     [instance performSelector:returnValue withObject: responseObject]; 
    } 
     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    { 
     [instance performSelector:returnValue withObject:nil]; 
     //NSLog(@"Error: %@", error); 
    }]; 
}