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.
'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
non compris. Pouvez-vous expliquer en bref? –
même si j'utilise le gestionnaire d'achèvement dans getJsonResponse1 cela ne fonctionne pas. –