【问题标题】:Multiple asynchronous URL requests多个异步 URL 请求
【发布时间】:2011-04-10 10:34:25
【问题描述】:

我的 iPhone 应用程序在通过启动屏幕时一直“滞后”或者更确切地说是“冻结”。我认为这是由于远程推送通知的注册是作为同步请求发送的,因此我想将其更改为异步。 这是一个问题,因为我已经发送了一个异步请求来检索一些数据并将其保存到手机中。 所以,我想异步发送这两个请求,并让它们在- (void)connectionDidFinishLoading:(NSURLConnection *)connection 中做两件不同的事情。因此,我需要知道完成了两个连接中的哪一个。

有没有办法做到这一点?有什么方法可以通过完成连接的 URL 来区分吗? 实际上,我认为设置一个tag 并在- (void)connectionDidFinishLoading:(NSURLConnection *)connection 中检查它很简单,但这似乎是不可能的。

有人知道我该怎么做吗?

【问题讨论】:

  • 使用 ASIHttpRequest 这是非常容易做到的,它是所有 iPhone 中最常用的 3rd 方库。你的问题解决了。

标签: iphone url asynchronous connection nsurlrequest


【解决方案1】:

正如 Kalle 所说,最好的办法是处理连接、解析响应并在漂亮的委托函数中返回数据的类。

但是,如果您出于某种原因必须使用相同的委托创建 2 个 NSURLConnections,那么您要做的就是在类 ivars 中保存对它们的引用。类似 NSURLConnection *pushNotificationConnection;和 NSURLConnection *someOtherConnection;

然后,您的 didReceiveData 函数应该如下所示:

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    if (connection == pushNotificationConnection)
    {
        // handle the push notification related data
    }
    else if (connection == someOtherConnection)
    {
        // handle the other connection
    }
}

【讨论】:

  • 这听起来很聪明。我对 Objective-C 很陌生。您将如何定义您的联系,以便能够像这样比较它们?
  • @SimonBS 在 vi​​ewController 的 .h 文件中(或任何启动连接并充当委托的类 - 您在其中解析来自连接的数据等)定义 *pushNotificationConnection; NSURLConnection *someOtherConnection;然后在触发连接时,适当地设置引用。例如 pushNotificationConnection = [NSURLConnection connectionWithRequest:myPushNotificationsRequest];对其他连接执行相同操作。然后将委托函数返回的连接与我的答案中的示例进行比较
  • 当然!非常感谢你。这解决了我的问题。我的应用程序现在启动时不会“冻结”。
  • -1 不发表评论?我明确指出,这通常应该在设计方面以不同的方式完成,但这正是 OP 正在寻找的......
  • 嘿,是的,我也得到了一个没有评论的反对票。我赞成您的意见只是为了“解决问题”。 耸耸肩
【解决方案2】:

一个干净的方法是让一个单独的类来处理每个请求。或者更确切地说,您有一个类应该执行请求,获取数据,然后在完成后将它们(通过委托)发送回主类。

因此,您将有两个类,例如PushNotificationRequestor 和 SomeLoader。每个人都将创建和维护自己单独的 HTTP(或任何类型)请求,并且每个人都有自己单独的 connectionDidFinishLoading: 等方法。

【讨论】:

    【解决方案3】:
    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
      if ([connection isEquals:pushNotificationConnection]) {
        // handle the push notification related data
      } else if ([connection isEquals:someOtherConnection]) {
        // handle the other connection
      }
    }
    

    【讨论】:

    • 请使用{} 工具栏按钮格式化您的代码。另外,请说明您的代码如何解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2012-05-26
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2019-01-05
    相关资源
    最近更新 更多