菜鸟教程小白 发表于 2022-12-13 12:14:16

ios - 什么是 diff b/w 同步和异步请求,如何以编程方式检查此操作


                                            <p><p>嗨,我是 ios 的初学者,当我们使用 NSURLRequest 调用服务时,我想知道当我们使用“同步请求”调用服务并以编程方式使用异步请求调用服务时会发生什么,
请以编程方式解释操作,我在下面使用该代码编写了一些代码解释同步和异步操作</p>

<h2>我的代码:-</h2>

<pre><code>- (void)viewDidLoad {
    ;

NSURL *url = ;
      NSMutableURLRequest *theRequest = ;

      ;
      ;
      ;
      ;

      NSURLConnection *connection = [ initWithRequest:theRequest delegate:self];

      if(connection){

            webData = [ init];
      }
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

    ;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    ;
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

    NSLog(@&#34;error is %@&#34;,);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

    NSString * allDataDictionbary = [ initWithData:webData encoding:NSUTF8StringEncoding];

    NSArray * responseString = ;

   NSLog(@&#34;final respone dictionary%@&#34;,responseString);
   }
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在回答您的问题时,同步请求会阻塞调用它们的线程,直到请求完成。 (因此,通常不鼓励同步请求。)异步请求让当前线程在执行请求时继续执行(例如,继续响应用户与应用程序的交互;响应系统事件等)。这通常是可取的。</p>
<p>您的代码正在执行异步请求(这很好)。不过也有一些问题:</p>
<ol>
<li><p>你不应该再使用 <code>NSURLConnection</code> 了。它已被弃用。使用 <code>NSURLSession</code>。它实际上更简单,因为您通常不必编写那些委托(delegate)方法(除非您想要这样做,因为您有一些迫切需要这样做)。</p>
<p>有关<code>NSURLSession</code> 的更多信息,请参阅<a href="https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW1" rel="noreferrer noopener nofollow">Using NSURLSession</a>在 <em>URLsession 编程指南中。</em> 或观看 WWDC 2013 视频 <a href="https://developer.apple.com/videos/play/wwdc2013-705/" rel="noreferrer noopener nofollow">What&#39;s New in Foundation Networking</a>一个很好的介绍。</p>
</li>
<li><p>你没有做一些错误处理。您正在检查基本错误(例如,没有网络),这非常好,但您没有考虑其他 Web 服务器错误,这些错误可能并不总是导致 <code>NSError</code> 对象,但可能只会导致200 以外的 HTTP 状态代码。我建议检查一下。</p>
<p>参见 <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" rel="noreferrer noopener nofollow">RFC 2616</a> 的第 10 节获取 HTTP 状态代码列表。</p>
</li>
<li><p>您正在设置 <code>application/json</code> 的 <code>Content-Type</code>。但这不是 JSON 请求。 (当然,响应是 JSON,但请求不是。)通常你会使用 <code>application/x-www-form-urlencoded</code> 来处理这样的请求。</p>
</li>
<li><p>在您的代码片段中,您建议来自服务器的响应是 JSON,其中 <code>NSArray</code> 作为顶级对象。但顶层对象是 <code>NSDictionary</code>。</p>
</li>
<li><p>您正在使用 <code>JSONValue</code>。我不确定是哪个 JSON 库,但我们中的许多人只是使用内置的 <a href="https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSJSONSerialization_Class/index.html#//apple_ref/occ/cl/NSJSONSerialization" rel="noreferrer noopener nofollow"><code>NSJSONSerialization</code></a> Apple 提供的类。很久以前,在 Apple 提供 <code>NSJSONSerialization</code> 之前,我们会使用第三方库来解析 JSON,但现在不再需要了。</p>
</li>
</ol>
<p><code>NSURLSession</code>发送请求的正确方式如下:</p>
<pre><code>NSURL *url = ;
NSMutableURLRequest *request = ;

;
;
;

NSURLSessionTask *task = [ dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (error != nil) {
      NSLog(@&#34;fundamental network error = %@&#34;, error);
      return;
    }
   
    if (]) {
      NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
      if (statusCode != 200) {
            NSLog(@&#34;Warning; server should respond with 200 status code, but returned %ld&#34;, (long)statusCode);
      }
    }
   
    NSError *parseError;
    NSDictionary *responseObject = ;
    if (responseObject) {
      NSLog(@&#34;responseObject = %@&#34;, responseObject);
    } else {
      NSLog(@&#34;Error parsing JSON: %@&#34;, parseError);
      NSString *responseString = [ initWithData:data encoding:NSUTF8StringEncoding];
      NSLog(@&#34;responseString = %@&#34;, responseString);
    }
}];
;

// Note, you&#39;ll reach this portion of your code before the
// above `completionHandler` runs because this request runs
// asynchronously. So put code that uses the network response
// above, inside that `completionHandler`, not here.
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 什么是 diff b/w 同步和异步请求,如何以编程方式检查此操作,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/34237161/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/34237161/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 什么是 diff b/w 同步和异步请求,如何以编程方式检查此操作