gpt4 book ai didi

objective-c - 如何从异步 NSURLConnection 返回到调用类?

转载 作者:太空狗 更新时间:2023-10-30 03:57:53 25 4
gpt4 key购买 nike

我有以下类,它异步发出 HTTP post 请求以避免在主 UI 线程上出现问题:

@implementation DataFeeder

-(void) doLookup:(NSString *)inputValue
{
NSString *myRequestString = [NSString stringWithFormat:@"val=%@", inputValue];
NSMutableData *myRequestData = [ NSMutableData dataWithBytes: [ myRequestString UTF8String ] length: [ myRequestString length ] ];

NSURL * myUrl = [NSURL URLWithString: @"http://mywebsite/results.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myUrl];
[request setHTTPMethod: @"POST"];
[request setHTTPBody: myRequestData];
[request setTimeoutInterval:10.0];

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

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
responseData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
// Show error message
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
// Use responseData
// Got all my response data here, so build up an object ready to send back
}

@end

我使用以下代码行从我的 ViewController 调用上面的内容:

MyObject * myObj = [feeder doLookup:@"SomeStaticStringForNow"];

所以,这就是我的理解:

  1. doLookup 将执行异步请求连接。
  2. 当数据完全加载后,它会调用connectionDidFinishLoading
  3. 数据加载完成后,我将从响应数据构建一个对象,并将其发送回调用 Controller

我怎样才能让调用 Controller 监听这个?我是否需要在 ViewController 中实现自己的回调方法以监听调用,然后停止微调器并根据 myObj 的内容更新 UI?

我希望有一个我忽略的非常简单的方法...

谢谢

最佳答案

是的,您应该使用委托(delegate)模式实现回调。在我看来,这是最简单、最标准的方法。正如您在其他回复中所见,还有其他方法。

在您的DataFeeder.h 文件中:

@protocol DataFeederDelegate
- (void)dataReady:(NSData*)data;
@end

@interface DataFeeder : NSObject {
id delegate_;
}
- (id)initWithDelegate:(id<DataFeederDelegate>)delegate;
@end

在您的 DataFeeder.m 中:

@implementation DataFeeder
- (id)initWithDelegate:(id<DataFeederDelegate>)delegate {
self = [super init];
if(self) {
delegate_ = delegate;
}
return self;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[delegate_ dataReady:responseData];
}
@end

您可以像这样实例化一个 DataFeeder 对象:

DataFeeder *dataFeeder = [[DataFeeder alloc] initWithDelegate:self];

当然,调用 View Controller 必须实现 DataFeederDelegate 方法。

关于objective-c - 如何从异步 NSURLConnection 返回到调用类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10836106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com