0

Voici mon code de travail avec NSURLConnection sendSynchronousRequest:Face à un problème avec NSURLSessionDataTask avec SynchronousRequest en c objectif

+ (Inc*)getData:(NSString*)inUUID { 
    NSString* urlString = [NSString stringWithFormat:@"/inc/%@", incUUID]; 
    NSURLRequest* request = [[HttpRequest requestWithRelativePath:urlString] toNSMutableURLRequest]; 
    NSDictionary* json = [self getJSONForRequest:request]; 
    return [Inc incFromDictionary:json]; 
} 
+ (NSDictionary*)getJSONForRequest:(NSURLRequest*)request { 
    NSData* responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    return [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil]; 
} 

Mais, sendSynchronousRequest:request est dépréciée. Pour cela, j'ai utilisé NSURLSessionDataTask au lieu de sendSynchronousRequest. Ici, est le code que je mis en œuvre:

+ (Inc*)getData1:(NSString*)inUUID { 
    NSString* urlString = [NSString stringWithFormat:@"/in/%@", inUUID]; 
    NSURLRequest* request = [[HttpRequest requestWithRelativePath:urlString] toNSMutableURLRequest]; 
    //NSDictionary* json = [self getJSONForRequest1:request]; 
    __block NSDictionary* json; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self getJsonResponse1:request success:^(NSDictionary *responseDict) { 
      json = [responseDict valueForKeyPath:@"detail"];; 
      //return [Inc incFromDictionary:json]; 

     } failure:^(NSError *error) { 
      // error handling here ... 
     }]; 
    }); 
    return [Inc incFromDictionary:json]; 
} 
+ (void)getJsonResponse1:(NSURLRequest *)urlStr success:(void (^)(NSDictionary *responseDict))success failure:(void(^)(NSError* error))failure 
{ 
    NSURLSessionDataTask *dataTask1 = [[NSURLSession sharedSession] dataTaskWithRequest:urlStr completionHandler:^(NSData *data, NSURLResponse *response, 
                                NSError *error) { 
     NSLog(@"%@",data); 
     if (error) 
      failure(error); 
     else { 
      NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
      NSLog(@"%@",json); 
      success(json); 
     } 
    }]; 
    [dataTask1 resume]; // Executed First 
} 

Le problème est appel déclaration retour getData1 avant la fin de l'appel api.

Merci d'avance.

+0

'dataTaskWithRequest' fonctionne de manière asynchrone, vous devez implémenter un gestionnaire d'achèvement comme dans' getJsonResponse1'. En fait, vous pouvez passer le même objet de bloc pour les deux gestionnaires. – vadian

+0

non compris. Pouvez-vous expliquer en bref? –

+0

même si j'utilise le gestionnaire d'achèvement dans getJsonResponse1 cela ne fonctionne pas. –

Répondre

1

Comme mentionné dans les commentaires, vous avez besoin d'un gestionnaire de complétion.

Quelque chose comme ça (non testé):

+ (void)getData1:(NSString*)inUUID success:(void (^)(NSDictionary *responseDict))success failure:(void(^)(NSError* error))failure { 
    NSString* urlString = [NSString stringWithFormat:@"/in/%@", inUUID]; 
    NSURLRequest* request = [[HttpRequest requestWithRelativePath:urlString] toNSMutableURLRequest]; 

    [self getJsonResponse1:request success:^(NSDictionary *responseDict) { 
     NSDictionary* json = [responseDict valueForKeyPath:@"detail"]; 
     success(json); 

    } failure:^(NSError *error) { 
     failure(error); 
    }]; 
} 


+ (void)getJsonResponse1:(NSURLRequest *)urlStr success:(void (^)(NSDictionary *responseDict))success failure:(void(^)(NSError* error))failure 
{ 
    NSURLSessionDataTask *dataTask1 = [[NSURLSession sharedSession] dataTaskWithRequest:urlStr completionHandler:^(NSData *data, NSURLResponse *response, 
                                NSError *error) { 
     NSLog(@"%@",data); 
     if (error) 
      failure(error); 
     else { 
      NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
      NSLog(@"%@",json); 
      success(json); 
     } 
    }]; 
    [dataTask1 resume]; // Executed First 
} 

Et pour appeler

[MyClass getData1:@"asdf" success:^(NSDictionary *responseDict) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSDictionary *json = [responseDict valueForKeyPath:@"detail"]; 
     Inc *inc = [Inc incFromDictionary:json]; 
     // do something witrh `inc` 

    }); 
} failure:^(NSError *error) { 
    // error handling here ... 
}]; 

Tenir compte d'utiliser des instances et des méthodes d'instance de votre classe (s) plutôt que seulement les méthodes de classe.

+0

ok maintenant j'ai compris. Laisse-moi essayer. –

+0

Merci beaucoup de petits changements et cela fonctionne comme un charme. –