我想创建一个同步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];
}
任何例子都会很棒。
答案 0 :(得分:9)
如果您想要同步连接,则必须使用+sendSynchronousRequest:returningResponse:error,没有其他简单方法可以执行此操作。
请注意,它已被弃用,而不是NSURLSession
,但它不支持直接同步连接。
答案 1 :(得分:4)
即使在后台线程中,同步网络也不是可行的方法。你不能正确地支持取消,而且你浪费了资源,剥离了一个大部分时间都空闲的后台线程。虽然如果您只发送一个URL请求,这主要是学术上的问题,但如果您发送大量请求,则可能是另一个故事。
您无需担心无法接收connection:didReceiveData:
次回调。您编写的内容看起来很好 - 您可以在收到数据时连接数据块,并使用connectionDidFinishLoading:
中的完整数据执行某些操作。
在重定向的情况下,您需要担心的是接收多个connection:didReceiveResponse:
回调。见Apple's documentation。在这种情况下,您只需要使用[xmlData setLength:0]
重置目前累积的数据。
最后,如果你可以要求iOS5或10.7并且不需要NSURLConnection委托的复杂性,那么新的+[sendAsynchronousRequest:queue:completionHandler:]
方法是+[sendSynchronousRequest:returningResponse:error]
的一个很好的,非邪恶的替代方法。