【问题标题】:how to create a synchronous NSURLConnection request如何创建一个同步的 NSURLConnection 请求
【发布时间】:2012-03-04 09:05:23
【问题描述】:

我想创建一个同步 nsurlconnection 请求。是的,我知道它很愚蠢,而且我知道它的局限性(冻结 UI),但是我想实现这一点的原因是我从服务器接收到的数据是按照发送的顺序接收的,这是好处之一同步连接..如果我没看错的话。

我将使用 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];
}

任何例子都会很棒。

【问题讨论】:

  • “石榴石我从服务器接收的数据是按照发送顺序接收的”是什么意思?同步网络(即使在后台线程中)几乎总是表明设计不佳。
  • 据我所知,异步有时会以错误的顺序接收数据。我必须与之通信的数据库引擎要求我同步执行此操作,因为它以正确的顺序接收数据很重要。为什么你认为它是糟糕设计的一个指标,我对你的观点很感兴趣,因为我目前只是按照我的指示去做,但是如果我可以向数据库工程师提出一个案例,说明他为什么应该这样做,否则我会有兴趣听听您的意见。
  • 这是不正确的——你不必担心接收到的connection:didReceiveData: 回调乱序。您编写的内容看起来不错——您可以在收到数据块时将它们连接起来,并对connectionDidFinishLoading: 中的完整数据进行处理。如果出于某种原因,您同时运行多个 NSURLConnections,所有这些都具有相同的委托,这只会是一个问题。但你通常不想这样做!
  • 好的,很酷,我明白你的意思,感谢您的澄清。

标签: iphone ios nsurlconnection sync


【解决方案1】:

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

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

【讨论】:

  • @C.Johns 没问题,如果它满足您的需要,请记住接受答案。
  • 它会..我一直在寻找错误的东西..这绝对是我需要使用的。希望我能想到它。
  • 这很好地描述了它stackoverflow.com/questions/6212453/…
【解决方案2】:

同步网络,即使在后台线程中,也不是要走的路。您不能正确地支持取消,而且您正在浪费资源,关闭一个大部分时间都处于空闲状态的后台线程。如果您只发送一个 URL 请求,这主要是学术问题,但如果您发送大量请求,则可能是另一回事。

您不必担心收到乱序的connection:didReceiveData: 回调。您编写的内容看起来不错——您可以在收到数据块时将它们连接起来,然后对 connectionDidFinishLoading: 中的完整数据进行处理。

您需要担心的是在重定向的情况下会收到多个connection:didReceiveResponse: 回调。见Apple's documentation。在这种情况下,您只需使用[xmlData setLength:0] 重置您迄今为止积累的数据。

最后,如果您需要 iOS5 或 10.7 并且不需要复杂的 NSURLConnection 委托,那么新的 +[sendAsynchronousRequest:queue:completionHandler:] 方法是 +[sendSynchronousRequest:returningResponse:error] 的一个不错的、非邪恶的替代方案。

【讨论】:

  • 好的,非常感谢您的帮助。我现在要再过一遍:)
猜你喜欢
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多