如何在 obj c 中使用同步和异步 Web

How to work Synchronous and Asynchronous web in obj c

我是开发新手,正在学习解析数据以及如何处理同步和异步请求。

NSString *url=@"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 行收到警告。如何处理这个异步 Web 请求并获取响应数据。解释两者的区别。

这里有两个不同的问题。

  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 是不受欢迎的,因为它不安全。您通常应该使用 httpsNSURLSession 将强制执行此操作,如果您尝试使用 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 控件 - 单击它并选择 "Open As" ... "Source Code" 然后添加以上。有关详细信息,请参阅