我正在使用Apple的Document中的代码进行一些HTTP通信。我可以成功连接到URL,但是我无法从服务器接收数据。
// create the request
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://..."]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
// Create the NSMutableData that will hold
// the received data
// receivedData is declared as a method instance elsewhere
NSMutableData *receivedData=[[NSMutableData data] retain];
} else {
// inform the user that the download could not be made
}
原因可能是:
我在Action本身中声明了receivedData
。注释说我应该在其他地方声明它。我应该在哪里申报?我应该将其声明为控制人的财产吗?
[[NSMutableData data] retain]
如何找到if{}
之外的网址?
答案 0 :(得分:5)
当您使用NSURLConnection的initWithRequest:delegate:方法时,数据(以及其他内容)将在一系列方法调用中发送到委托对象。这些方法都是可选的,因此如果您的委托对象没有实现它们,那么连接对象就会跳过它们。
有很多方法,所以我不会在这里列出所有方法,但是它们都在NSURLConnection文档中有详细描述。要获取接收的数据,您需要在委托对象上实现-connection:didReceiveData :.使用表示新接收数据的NSData对象,可能会多次调用此方法。然后,您可以将其附加到现有的NSMutableData对象,或者执行其他任何有意义的操作。您知道在委托对象上调用了--connectionDidFinishLoading:时,您已收到所有数据。
回答你的两个具体问题:
是的,您应该将其声明为控制器对象的属性。您还应该确保在调用NSURLConnection的initWithRequest:delegate:之前分配对象,因为连接将在创建连接对象后立即异步加载数据。或者你可以在委托上实现-connection:didReceiveResponse:,检查HTTP状态,然后创建数据对象。
可变数据对象无法找到您设置的URL,连接或数据,但如果您按照我所描述的步骤进行操作,则可以将数据添加到其中它进来了,并在连接完成时使用它。