0

我正在尝试使用异步类型将 URL 发布到服务器,例如

_urlConn = [[NSURLConnection alloc] initWithRequest:_urlReq delegate: self];

我得到了正确的响应,并且我使用代理方法(例如 didRecieveResponse 和 connectionDidFinishLoading)很好地处理了响应。到目前为止,流程运行良好。我面临一个我无法清楚地解决的新问题。

假设我有一个按钮,它将发布相同的 URL。

  1. 我点击按钮发布网址
  2. 当再次单击按钮时(在一/两秒内),不会发布 URL(我已经编写了逻辑)。
  3. URL 已发布(对于第一个按钮单击),直到现在我还没有收到任何响应,现在我正在尝试再次单击该按钮,该按钮现在将发布 URL。

我的应用程序就在这里。是不是因为我用的是_ReleaseObject(_urlConn);inconnectionDidFinishLoading方法???

4

2 回答 2

1

使用委托回调时需要非常小心。

在这个例子中,一个对象是两个同时的 NSURLConnection 对象的委托。这是一个坏主意。除非您开发一种将特定连接与适当的响应数据对象相关联的方法,否则您最终会混合响应数据。在这种情况下,使用 _urlConn (我假设是一个 iVar)而不是 connection (传递给 的参数)会使事情变得更糟-connectionDidFinishLoading:

为了简化所有这些,您需要在现有请求待处理时不发出新请求,或者您需要在开始新请求之前取消旧请求。

于 2012-06-18T14:32:47.387 回答
1

我刚刚在这里回答了某人关于使用同一个委托处理多个并发下载的问题。(@Jeffery 是对的——它需要保持每个状态,键控在连接对象上)。

这是我处理您的具体示例的方式...

- (IBAction)postButtonPressed:(id)sender {

    sender.enabled = NO;  // no more presses until we are ready again

    [UIView animateWithDuration:0.3 animations:^{
        sender.alpha = 0.3;  // or some effect to make your button appear disabled
    }];

    NSURLRequest *request = // build your post request here

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]
        completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

            // check for error, do whatever you intend with the response
            // then re-enable the button
            sender.enabled = YES;
            [UIView animateWithDuration:0.3 animations:^{sender.alpha=1.0;}];
    }];
}
于 2012-06-18T15:50:58.197 回答