2017-04-23 5 views
0

Ich habe eine Klasse, die Verbindungen mit AFNetworking verwaltet.So geben Sie einen Wert im Abschlussblock zurück

Deshalb möchte ich meine Funktion aufzurufen, wie NSDictionary *dict = [ServerManager requestWithURL:@"https://someurl.com"];

Und das ist die Funktion in der anderen Klasse:

- (NSDictionary *) requestWithURL:(NSString *)requestURL { 
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 
    [manager GET:requestURL parameters:nil progress:nil 
     success:^(NSURLSessionDataTask *operation, id responseObject){ 

      return responseObject; 

    } 
     failure:^(NSURLSessionDataTask *operation, NSError *error) { 

    }]; 
} 

Ich weiß, dass nicht richtig ist, das zu tun. Also, was soll ich tun, um responseObject zurück zu NSDictionary *dict? Ich möchte die Grundidee der asynchronen Entwicklung mit Blöcken bekommen.

Antwort

3

Da die Vernetzung Anforderung abgeschlossen lange nach seiner gestartet wird,

der einzige Weg, das Ergebnis ist mit einem Block übergeben Ihre Anfrage Methode ...

// when request completes, invoke the passed block with the result or an error 
- (void)requestWithURL:(NSString *)requestURL completion:(void (^)(NSDictionary *, NSError *))completion { 
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 
    [manager GET:requestURL parameters:nil progress:nil success:^(NSURLSessionDataTask *operation, id responseObject){ 
     if (completion) completion((NSDictionary*)responseObject, nil); 
    }, failure:^(NSURLSessionDataTask *operation, NSError *error) { 
     if (completion) completion(nil, error); 
    }]; 
} 

Machen Sie es öffentlich in einem ServerManager.h zu handhaben

- (void)requestWithURL:(NSString *)requestURL completion:(void (^)(NSDictionary *, NSError *))completion; 

An anderer Stelle nennt es:

[ServerManager requestWithURL:@"http://someurl.com" completion:^(NSDictionary *dictionary, NSError *error) { 
    // check error and use dictionary 
}]; 
Verwandte Themen