string iPhone NSURLConnection: connectionDidFinishLoading - 如何将字符串返回给调用方法
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2249531/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
iPhone NSURLConnection: connectionDidFinishLoading - how to return a string to the calling method
提问by
I have reviewed similar stackoverflow questions/answers to this but I am still stumped.
我已经回顾了类似的 stackoverflow 问题/答案,但我仍然很难过。
I'm a beginner and I'm really struggling with this. With the iPhone, I can download XML from a URL but I cannot store the result string in a NSString variable and see it from the calling function.
我是初学者,我真的很挣扎。使用 iPhone,我可以从 URL 下载 XML,但我无法将结果字符串存储在 NSString 变量中并从调用函数中查看它。
I have the following declarations in a custom made class:
我在定制类中有以下声明:
@interface comms : NSObject {
NSString *currURL, *receivedString;
NSMutableData *receivedData;
NSURLConnection *conn;
}
@property (copy, readwrite) NSString *currURL;
@property (copy, readonly) NSString *receivedString;
@property (nonatomic, assign) NSMutableData *receivedData;
@property (nonatomic, assign) NSURLConnection *conn;
-(void) getContentURL;
I have the following method in the comms class:
我在通信类中有以下方法:
-(void) getContentURL
{
NSLog( @"Begin getContentURL." );
// Request data related.
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init]
autorelease];
[request setURL:[NSURL URLWithString: currURL]];
// Content-Type related.
[request setValue:@"application/x-www-form-urlencoded"
forHTTPHeaderField:@"Content-Type"];
// Create Connection.
conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (conn) {
// The connection was established.
receivedData = [[NSMutableData data] retain];
NSLog( @"Data will be received from URL: %@", request.URL );
}
else
{
// The download could not be made.
NSLog( @"Data could not be received from: %@", request.URL );
}
// PROBLEM - receivedString is NULL here.
NSLog( @"From getContentURL: %@", receivedString );
}
I have created the required delegates in the comms class as per the following:
我已经按照以下方式在通信类中创建了所需的委托:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:
(NSURLResponse *)response
{
// Discard all previously received data.
[receivedData setLength:0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:
(NSData *)data
{
// Append the new data to the receivedData.
[receivedData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// Connection succeeded in downloading the request.
NSLog( @"Succeeded! Received %d bytes of data", [receivedData length] );
// Convert received data into string.
receivedString = [[NSString alloc] initWithData:receivedData
encoding:NSASCIIStringEncoding];
NSLog( @"From connectionDidFinishLoading: %@", receivedString );
// release the connection, and the data object
[conn release];
[receivedData release];
}
I can successfully output the receivedString string using NSLog in the connectionDidFinishLoading delegate.
我可以在 connectionDidFinishLoading 委托中使用 NSLog 成功输出 receivedString 字符串。
// Convert received data into string.
receivedString = [[NSString alloc] initWithData:receivedData
encoding:NSASCIIStringEncoding];
NSLog( @"From connectionDidFinishLoading: %@", receivedString );
However, when I output the receivedString string in the getContentURL it's null (and hence is also null from the ViewController.m class which I call the comms class from).
但是,当我在 getContentURL 中输出 receivedString 字符串时,它是空的(因此也是我调用 comms 类的 ViewController.m 类中的空)。
// PROBLEM - receivedString is NULL here.
NSLog( @"From getContentURL: %@", receivedString );
Any ideas on how I can see the value of receivedString in getContentURL and from the ViewController.m class?
关于如何在 getContentURL 和 ViewController.m 类中查看 receivedString 值的任何想法?
回答by Grant Paul
NSURLConnection is an asynchronous API. When you start the request, the object will spawn a new thread, and only update your main one via the callback/delegate methods. Your current method will return most likely before the request is finished, and so the string of the result will not have downloaded yet!
NSURLConnection 是一个异步 API。当您开始请求时,该对象将产生一个新线程,并且仅通过回调/委托方法更新您的主线程。您当前的方法很可能会在请求完成之前返回,因此结果字符串还没有下载!
If you want to do this synchronously, you will have two options:
如果您想同步执行此操作,您将有两个选择:
- Use the built in synchronous download method. Note that as this blocks, it will not allow the user to interact with the UI.
- Use the C functions CFRunLoopRun() and CFRunLoopStop() to start the run loop inside your calling function, wait until the download is complete or failed, then return control back to the calling method with CFRunLoopStop().
- 使用内置的同步下载方法。请注意,由于此块,它将不允许用户与 UI 交互。
- 使用 C 函数 CFRunLoopRun() 和 CFRunLoopStop() 在调用函数内启动运行循环,等待下载完成或失败,然后使用 CFRunLoopStop() 将控制权返回给调用方法。
回答by Hassan Adeel
To return data from the delegates method, please use Code Block.
要从委托方法返回数据,请使用代码块。