Отображение счетчика с использованием spinKit в iOS при получении JSON
Что я пытаюсь сделать, так это то, что одним нажатием кнопки я выбираю данные с помощью модуля AFNetworking. То, что я хочу, это после получения данных, которые я хочу отобразить NSLog(@"/n /nAfter fetching");
но это идет до данных JSON.
Вот код, который я написал в IBAction of Button.
dispatch_queue_t queue = dispatch_get_global_queue(
DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{
//Load the json on another thread
NSURL *url = [NSURL URLWithString:finalURL];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc]initWithSessionConfiguration:configuration];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response,id responseObject, NSError *error) {
if (error) {
NSLog(@"\n Error --> %@",error);
}
else{
jsonDictionary = (NSDictionary*) responseObject;
NSLog(@"/n Data :: %@",jsonDictionary);
}
}];
[dataTask resume];
});
NSLog(@"/n /nAfter fetching");
Пожалуйста, предоставьте хороший способ сделать это и исправьте меня, если я ошибся с этим. Спасибо.
1 ответ
Решение
Так как AFURLSessionManager выполняет асинхронную операцию. Вы получите данные в завершение
dispatch_queue_t queue = dispatch_get_global_queue(
DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_sync(queue, ^{
//Load the json on another thread
[self startSpinner];
NSURL *url = [NSURL URLWithString:finalURL];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc]initWithSessionConfiguration:configuration];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response,id responseObject, NSError *error) {
[self stopSpinner];
if (error) {
NSLog(@"\n Error --> %@",error);
}
else{
NSLog(@"/n /nAfter fetching"); //this is where you receive data
jsonDictionary = (NSDictionary*) responseObject;
NSLog(@"/n Data :: %@",jsonDictionary);
}
}];
[dataTask resume];
});
если вы хотите сделать синхронную операцию, используя метод URLSession ниже, вам поможет
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request
returningResponse:(__autoreleasing NSURLResponse **)responsePtr
error:(__autoreleasing NSError **)errorPtr {
dispatch_semaphore_t sem;
__block NSData * result;
result = nil;
sem = dispatch_semaphore_create(0);
[[[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (errorPtr != NULL) {
*errorPtr = error;
}
if (responsePtr != NULL) {
*responsePtr = response;
}
if (error == nil) {
result = data;
}
dispatch_semaphore_signal(sem);
}] resume];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
return result;
}