【问题标题】:How can I send multiple url request from a NSURLConnection delegate?如何从 NSURLConnection 委托发送多个 url 请求?
【发布时间】:2012-02-17 09:59:21
【问题描述】:

这是我的应用程序的逻辑流程:

  1. 首先,当视图控制器完成加载后,NSURLConnection 请求就可以开始执行了

  2. 响应包含在 xml 数据中

  3. 解析该 xml 后,我需要发送另一个 NSURLConnection 请求。

  4. 发送第二个请求后,如果响应ok,则收到其他xml数据

  5. 解析第二个xml后,我必须检查第一个和第二个xml数据之间的一些问题。

那么,是否可以发送多个请求?如何?我不需要代码,你解释一下就行了。

提前谢谢你。

【问题讨论】:

  • 你是从一个类还是多个类发送多个请求??
  • 我从一个班级发送多个请求。

标签: ios xmlhttprequest xml-parsing nsurlconnection


【解决方案1】:

我用 NSURLConnection 来做这件事,让它们成为属性,然后检查它是哪一个:

 @property (nonatomic,retain) NSURLConnection *myConnection;
@property (nonatomic,retain) NSURLConnection *mySecondConnection;

然后在委托中:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

     if (connection == myConnection){
       //do something
    }

    if (connection == mySecondConnection){
       // do something else
        }

}

您可以将您的 NSURLRequest 传递给连接:

self.myConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

【讨论】:

  • 简单优雅的解决方案!谢谢:)
  • +1 这应该是接受的答案,而不是发送接受的答案中建议的同步请求。
  • 我同意。这是一个更好的解决方案。
【解决方案2】:

有一个第三方库可用,它是 CFNetwork 上的包装器ASIHTTPREQUEST

这个库应该为你工作。这样您就不必从头开始编写代码。另一种选择是创建一个类,该类将负责创建NSURLConnection,然后发送请求,最后使用委托或通知接收到一个数据通知视图控制器。

【讨论】:

  • 该类不符合 ARC。更好地使用 NSURLConnection。
  • 这是一个很好的解决方案,但我相信作者已经放弃了它。所以我会给它一个+1,但应该注意的是,虽然它是相关的,但它不再是了。
  • 不再使用这个库,但它确实是一个很棒的库——希望有人能维护它。无法使用此库连接某些 HTTPS 服务器。
【解决方案3】:
- (void)viedDidLoad{

    [super viewDidLoad];
    [self firstRequestMethod];

}

- (void)firstRequestMethod{

    NSString *myFirstRequestURL = @"<URL>";
    NSURL *webURL = [NSURL URLWithString:myFirstRequestURL];        

    NSURLRequest *request = [NSURLRequest requestWithURL:webURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSError *error;
    NSURLResponse *response;
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    if(returnData)
    {
        NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSASCIIStringEncoding];
        //Parse your response here.
        //Is desired response obtain call the second Request, as described above
        if (TRUE) {  //on success
            [self secondRequestMethod];
        }

    }



}

- (void)secondRequestMethod{

    NSString *mySecondRequestURL = @"<URL>";
    NSURL *webURL = [NSURL URLWithString:mySecondRequestURL];        

    NSURLRequest *request = [NSURLRequest requestWithURL:webURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
    NSError *error;
    NSURLResponse *response;
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    if(returnData)
    {
        NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSASCIIStringEncoding];
        //Parse your response here.
        //Is desired response obtain call the second Request, as described above
        if (TRUE) {  //on success
            //subsequent calls to other url, same as above
        }

    }



}

希望这能帮助你更好地理解......

【讨论】:

  • 可以告诉我完整的过程吗?我得到了你的答案,但我不知道我该如何继续孔过程。一步一步写过程,我以前没有使用过这种工作。
  • 您可以使用 NSDictionary 在两种方法之间进行维护,以便您可以在 secondRequestMethod 以及后续的 url 方法中传递您希望检查和比较的值。那不会对你来说很重要......
  • 一开始就使用同步请求是个坏主意,很好解释here
  • @Nikhita,同步请求有利有弊,我们必须根据需要使用它们。在上述情况下使用 Async req 是不值得的。这篇文章是为了向用户解释同步调用。
  • 这不是一个很好的答案。同步请求可能会锁定 UI,使用户不愉快的应用程序。最好使用异步线程,这样用户就不会认为应用程序“冻结”了它们。 (而且它实际上并没有回答问题)。
猜你喜欢
  • 2012-05-08
  • 2023-04-11
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多