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(@"error is %@",);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString * allDataDictionbary = [ initWithData:webData encoding:NSUTF8StringEncoding];
NSArray * responseString = ;
NSLog(@"final respone dictionary%@",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'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(@"fundamental network error = %@", error);
return;
}
if (]) {
NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
if (statusCode != 200) {
NSLog(@"Warning; server should respond with 200 status code, but returned %ld", (long)statusCode);
}
}
NSError *parseError;
NSDictionary *responseObject = ;
if (responseObject) {
NSLog(@"responseObject = %@", responseObject);
} else {
NSLog(@"Error parsing JSON: %@", parseError);
NSString *responseString = [ initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"responseString = %@", responseString);
}
}];
;
// Note, you'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]