iOS SDK - 如何进行"fire and forget"网络调用?



我有一个Web服务,我想发送一些信息,但我不在乎来自该服务器的响应。我只想给服务器信息,它用它做任何它想做的事情。

我怎样才能在iOS中使用objective-C做到这一点?我目前正在使用后台线程网络调用,但它得到一个响应,我担心如果用户关闭应用程序或在场景之间导航,返回的响应可能会使应用程序崩溃并带有空引用。

我假设你有一个HTTP网络服务。在通常的HTTP中,几乎没有"即发即弃"这样的事情。最接近的事情是发送 HEAD 请求,因为关于它的约定是对 HEAD 方法的响应不应该有正文。但这仍然只是一个惯例。

如果您自己控制 Web 服务,例如,您正在使用返回空响应的 POST,那么由于 HTTP 逻辑,您仍然必须:

  1. 建立 TCP/TLS 连接(适用于 HTTPS)
  2. 发送 HTTP 请求
  3. 接收状态为 200 OK 的 HTTP 响应

其中每个都可能失败,如果失败,则无法确定呼叫是否已到达服务器。例如,您的服务器可能会返回 500 服务器错误,是否要忽略它取决于您,但您必须等待它。如果您没有收到它,它可能只是超时(例如,如果您已发送请求并且长时间没有响应)。另请注意,将应用发送到后台和资源压力可能是请求未传递的另一个原因。

在许多情况下,当您希望确保请求已送达时,您必须检查响应代码,并可能重试几次请求。

如果你真的不在乎你的请求是否被传递,你可以忽略NSURLResponse和NSError在你的NSURLSessionDataTask的completionHandler中。

如果你真的担心这一点,并且真的不关心请求是成功还是失败,你可以将请求包装在一个try块中,然后将其后台到另一个线程。这应该完全将其与应用的其余部分隔离开来。

相关内容

  • 没有找到相关文章