2016-03-18 2 views
-2

Я новичок в разработке, изучая синтаксический анализ данных и работу с синхронными и асинхронными запросами.Как работать с синхронной и асинхронной сетью в obj c

NSString *[email protected]"http://content.guardianapis.com/search?api-key=test"; 

NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
NSError *error=nil; 
NSURLResponse *response; 
NSData *content=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
NSString *string=[[NSString alloc]initWithData:content encoding:NSUTF8StringEncoding]; 
NSLog(@"response %@",string); 

я получил предупреждение на sendSynchronousRequest линии. Как обработать этот асинхронный веб-запрос и получить данные ответа. Объясните разницу обоих.

ответ

0

Два отдельных вопроса здесь.

  1. Во-первых, запрос должен быть асинхронным и использовать NSURLSession. Например:

    NSURL *url = [NSURL URLWithString:@"http://content.guardianapis.com/search?api-key=test"]; 
    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
        if (error) { 
         NSLog(@"%@", error); 
         return; 
        } 
    
        NSError *parseError; 
        NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError]; 
    
        if (responseObject) { 
         NSLog(@"%@", responseObject); 
         dispatch_async(dispatch_get_main_queue(), { 
          // if you want to update your UI or any model objects, 
          // do that here, dispatched back to the main queue. 
         }); 
        } else { 
         NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
         NSLog(@"problem parsing response, it was:\n%@", string); 
        } 
    }]; 
    [task resume]; 
    
    // but do not try to use `data` here, as the above runs asynchronously 
    // do everything contingent upon this request _inside_ the completion 
    // handler above 
    

    Примечание, когда вы получите ответ JSON, вы можете разобрать, что с NSJSONSerialization, как показано выше.

  2. В настоящее время использование запросов http недоверчиво, потому что оно небезопасно. Обычно вы должны использовать https. И NSURLSession обеспечит это, возвращая ошибку, если вы попытаетесь использовать http. Но если вы хотите, чтобы заставить его разрешить небезопасную http запрос, вы должны обновить вашу info.plist с записью, которая выглядит как:

    <key>NSAppTransportSecurity</key> 
    <dict> 
        <key>NSExceptionDomains</key> 
        <dict> 
        <key>guardianapis.com</key> 
        <dict> 
         <!--Include to allow subdomains--> 
         <key>NSIncludesSubdomains</key> 
         <true/> 
         <!--Include to allow HTTP requests--> 
         <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
         <true/> 
         <!--Include to specify minimum TLS version--> 
         <key>NSTemporaryExceptionMinimumTLSVersion</key> 
         <string>TLSv1.1</string> 
        </dict> 
        </dict> 
    </dict> 
    

    Итак, перейдите на info.plist, управления -Click на нем и выберите «Открыть как» ... «Исходный код», а затем добавить в него выше. См. https://stackoverflow.com/a/31254874/1271826 для получения дополнительной информации.

+0

способ использования в синхронном режиме. в чем разница между синхронными и асинхронными запросами. – saravanar

+0

@saravanar - Синхронные средства «блокируют поток при выполнении запроса», тогда как асинхронный означает полную противоположность, а именно, что текущий поток не будет заблокирован и что код в обработчике завершения будет вызван асинхронно (т.е. позже) , Вы почти никогда не хотите выполнять синхронные запросы (потому что если вы сделаете это из основного потока, вы заблокируете основной поток, что может привести к разным проблемам). 'NSURLSession' даже не предлагает синхронных запросов. Может потребоваться немного времени, чтобы действительно ознакомиться с асинхронным программированием, но это очень важно. – Rob

+0

запрос должен быть асинхронным и использовать NSURLSession. как использовать синхронно .. – saravanar