2012-02-12 71 views
1

我想创建一个同步nsurlconnection请求。是的,我知道它的愚蠢和我知道的限制(冻结用户界面),但我想实现这个来石榴石我从服务器接收到的数据的原因是收到它的发送顺序,这是好处之一同步连接..如果我正确读取。如何创建同步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

你是什么意思的“我从服务器收到的数据是按照发送顺序接收的”石榴石?即使在后台线程中,同步网络几乎总是一个糟糕设计的指标。 – 2012-02-12 21:36:00

+0

就我所知,异步有时可能会以错误的顺序接收数据。我必须与之通信的数据库引擎要求我以同步方式执行此操作,因为它的重要性在于以正确的顺序接收数据。为什么你认为它是一个糟糕的设计指标,我对你的观点很感兴趣,因为我目前只按照我的指示去做,但是如果我可以把一个案例交给数据库工程师,为什么他应该这样做,否则我会对听取您的意见感兴趣。 – 2012-02-12 21:51:26

+1

这是不正确的 - 你不必担心接收连接:didReceiveData:'回调失序。你写的东西看起来很好 - 你可以在接收到数据时连接数据块,然后用'connectionDidFinishLoading:'中的完整数据做一些事情。这只会是一个问题,如果出于某种原因,您同时运行多个NSURLConnections,都使用相同的代理。但你通常不想那么做! – 2012-02-12 22:34:34

回答

9

如果你想要一个同步连接,你必须使用+sendSynchronousRequest:returningResponse:error没有其他简单的方法来做到这一点。

请注意,它被弃用为NSURLSession,但它不直接支持同步连接。

+0

好吧凉爽..去看看如何使用现在..谢谢。 – 2012-02-12 20:46:41

+0

@ C.Johns没有问题,只要记住接受答案,如果它做你需要它。 – 2012-02-12 20:47:20

+0

它会......我一直在寻找错误的东西..这是我需要使用的。希望我能工作想到它。 – 2012-02-12 20:57:06

4

同步网络,即使在后台线程中,也不是要走的路。您无法正确支持取消操作,而且您正在浪费资源,从而耗尽大部分时间闲置的后台线程。虽然这主要是一个学术问题,如果您只发送一个URL请求,如果您发送大量请求可能是另一回事。

您不必担心无法接收connection:didReceiveData:回调。您所写的内容看起来很好 - 您可以在接收数据时将数据块连接起来,并使用connectionDidFinishLoading:中的完整数据进行操作。

你不必担心在重定向的情况下接收多个connection:didReceiveResponse:回调。见Apple's documentation。在这种情况下,您只需要将[xmlData setLength:0]迄今积累的数据重置。

最后,如果你可以要求iOS5或10.7,并且不需要NSURLConnection代理的复杂性,那么新的+[sendAsynchronousRequest:queue:completionHandler:]方法是一个很好的,非邪恶的替代+[sendSynchronousRequest:returningResponse:error]

+0

好的,非常感谢您的帮助。我现在要继续讨论一下:) – 2012-02-13 00:02:15