我想创建一个同步nsurlconnection请求。是的,我知道它的愚蠢,我知道限制(冻结用户界面)但是我想实现这个来接收我从服务器接收的数据的原因是按照它发送的顺序接收,这是其中一个好处同步连接..如果我读得正确。
我将使用Grand Central Dispatch来实现一些多线程以便运行同步请求并且不会影响主线程的UI ...但是这可以在以后发现我想掌握同步连接。
一个问题是我不确定如何将我的连接设置为同步..
这是我的代码。
- (void)loadComics{
[comics removeAllObjects]; //clears object of any old values
[[self tableView] reloadData];
NSURL *url = [NSURL URLWithString:@"http://www.comicbookresources.com/feed.php?feed=previews"];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30];
//clear any existing connection
if (connectionInProgress) {
[connectionInProgress cancel];
[connectionInProgress release];
}
[xmlData release];
xmlData = [[NSMutableData alloc] init];
connectionInProgress = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[xmlData appendData:data];
}
- (void) connectionDidFinishLoading:(NSURLConnection *)connection{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];
[parser setDelegate:self];
[parser parse];
[parser release];
[[self tableView] reloadData];
}
任何例子都会很棒。
如果你想要一个同步连接,你必须使用+sendSynchronousRequest:returningResponse:error没有其他简单的方法来做到这一点。
请注意,它被弃用而不是NSURLSession
,但它不直接支持同步连接。
即使在后台线程中,同步网络也不是可行的方法。您无法正确支持取消,并且您正在浪费资源,剥离了将大部分时间用于空闲的后台线程。虽然如果您只发送一个URL请求,这主要是一个学术问题,但如果您发送大量请求,则可能是另一个故事。
您不必担心无序接收connection:didReceiveData:
回调。您编写的内容看起来很好 - 您可以在收到数据时连接数据块,并使用connectionDidFinishLoading:
中的完整数据执行某些操作。
你需要担心的是在重定向的情况下接收多个connection:didReceiveResponse:
回调。见Apple's documentation。在这种情况下,您只需要使用[xmlData setLength:0]
重置目前累积的数据。
最后,如果你可以要求iOS5或10.7并且不需要NSURLConnection委托的复杂性,那么新的+[sendAsynchronousRequest:queue:completionHandler:]
方法是+[sendSynchronousRequest:returningResponse:error]
的一个不错的,非邪恶的替代方法。