【问题标题】:How to properly do NSURLConnection calls?如何正确进行 NSURLConnection 调用?
【发布时间】:2014-05-03 20:14:02
【问题描述】:

我开始研究 iOS 的网络编程。我正在关注教程并停止,因为我收到“变量从未使用”警告。我发现另一个教程以不同的方式处理它,但它也会产生警告。然后,我决定查看 Apple 的示例代码,结果发现他们也采用了另一种方式!

教程1: http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request 
                                                        delegate:self];

教程 2: http://www.cimgf.com/2010/02/12/accessing-the-cloud-from-cocoa-touch/

[[NSURLConnection alloc] 
    initWithRequest:request 
               delegate:self];

苹果: https://developer.apple.com/library/ios/samplecode/SimpleURLConnections/Listings/PostController_m.html#//apple_ref/doc/uid/DTS40009245-PostController_m-DontLinkElementID_12

// Declare property in .m file so it doesn't show as public
@property (nonatomic, strong, readwrite) NSURLConnection *  connection;
// Then just assign to it when the connection is created
self.connection = [NSURLConnection connectionWithRequest:request delegate:self];

Apple 的方法消除了警告,但分配给一个永远不会再次读取的变量似乎有点浪费。这是最佳做法吗?

【问题讨论】:

  • 如果您只是针对 iOS 7,请改用NSURLSession,或者直接使用AFNetworking。即使您不只是针对 iOS 7,我仍然建议使用 AFNetworking,它消除了对大量样板代码的需求。
  • 我需要支持 iOS 6,否则我会像你建议的那样使用NSURLSession。不幸的是,我不允许在这个项目中使用任何第三方库。我很想使用AFNetworking!谢谢

标签: ios objective-c nsurlconnection


【解决方案1】:

如果您不需要 NSURLConnection 变量,只需执行以下操作:

[NSURLConnection connectionWithRequest:request delegate:self];

这可以防止您在问题中描述的编译器警告。

如果您希望能够在以后取消请求(例如,用户在连接进行时关闭视图控制器),那么您可以将 NSURLConnection 保存在一个属性中,然后您就可以cancel视图控制器关闭时的请求。

否则,上面显示的语法会在没有变量和编译器警告的情况下启动连接。

【讨论】:

  • 这消除了警告,谢谢!现在我注意到,这些教程是一年和两年前的。这种方法看起来也比其他方法更干净。
【解决方案2】:

变量不会“从不”被使用。

connectionWithRequest:delegate: 实际上并没有启动任何网络。在实际启动连接之前,您必须在变量上调用start 方法。并且在它启动后,你可以在变量上调用cancel方法来停止连接。


编辑:根据 Rob 的评论,connectionWithRequest: 和大多数 NSURLConnection 实例化方法实际上启动了请求。如果您想cancel,该变量仍会返回(您可能还可以用它做其他事情)。

但是,如果您在启动连接后不想对变量做任何事情,还有其他方法可以创建连接。我会编辑它们。

你可以使用sendAsynchronousRequest:queue:completionHandler:,它返回void。

对于此方法,您发送请求参数,并为连接提供一个队列,并在连接完成时执行一个块。

您也可以按照 Rob 的建议进行操作,只是不要将返回值放在任何地方:

[NSURLConnection connectionWithRequest:request delegate:self];

如果出于某种原因,你也不喜欢这个,你可以这样做:

@autoreleasepool {
    NSURLConnection *foo = [NSURLConnection connectionWithRequest:request delegate:self];
#pragma unused(foo)
}

我想在编译过程中会直接优化到前面的例子:

[NSURLConnection connectionWithRequest:request delegate:self];

请注意,#pragma unused(someVar) 将抑制给定变量的未使用变量警告。

【讨论】:

  • connectionWithRequest 确实启动了连接。您不必(也不应该)start 连接。
  • 我还没有遇到过我想取消正在发送的请求的情况,但我会记住我需要保存连接变量。感谢您提供所有替代方案。
  • 声明变量时可以只使用__unused__unused NSURLConnection *foo
猜你喜欢
  • 2023-03-09
  • 2018-12-03
  • 2015-08-28
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
相关资源
最近更新 更多