如何正确执行NSURLConnection调用?

时间:2014-05-03 20:14:02

标签: ios objective-c nsurlconnection

我开始研究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的方法摆脱了警告,但分配给永远不会再读的变量似乎有点浪费。这是最好的做法吗?

2 个答案:

答案 0 :(得分:1)

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

[NSURLConnection connectionWithRequest:request delegate:self];

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

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

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

答案 1 :(得分:0)

变量赢了"从不"使用。

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)将禁止给定变量的未使用变量警告。