Отображение счетчика с использованием 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;  
} 
Другие вопросы по тегам