gpt4 book ai didi

iphone - 从网络上的数据抓取类返回数据?

转载 作者:行者123 更新时间:2023-12-01 18:33:53 25 4
gpt4 key购买 nike

我正在尝试创建一个类,它可以让我从 Web 服务获取请求的数据。我被困在如何返回值上。

// FooClass.m
// DataGrabber is the class which is supposed to get values
dataGrabber = [[DataGrabber alloc] init];
xmlString = [dataGrabber getData:[NSDictionary dictionaryWithObjectsAndKeys:@"news", @"instruction", @"sport", @"section", nil]];

在这个例子中,它应该得到体育新闻。问题是 DataGrabber 异步获取数据并最终从几个 NSURLConnection 委托(delegate)方法中跳转。如何在 FooClass 中知道何时收到数据?

最佳答案

代表模式与严格的协议(protocol)一起使用对此非常有用(这就是 DataGrabber 在 NSURLConnection 完成时会发现的方式,对吧?)。我已经编写了许多以这种方式使用 XML 和 JSON 信息的 Web API。

// In my view controller
- (void) viewDidLoad
{
[super viewDidLoad];
DataGrabber *dataGrabber = [[DataGrabber alloc] init];
dataGrabber.delegate = self;
[dataGrabber getData:[NSDictionary dictionaryWithObjectsAndKeys:@"news", @"instruction", @"sport", @"section", nil]];
}

然后在您的 DataGrabber.h 文件中:
@protocol DataGrabberDelegate
@required
- (void) dataGrabberFinished:(DataGrabber*)dataGrabber;
- (void) dataGrabber:(DataGrabber*)dataGrabber failedWithError:(NSError*)error;
@end

在 DataGrabber.m 中:
- (void) getData:(NSDictionary*)dict
{
// ... Some code to process "dict" here and create an NSURLRequest ...
NSURLConnection *connection = [NSURLConnection connectionWithRequest:req delegate:self];
}

- (void) connectionDidFinishLoading:(NSURLConnection*)connection
{
// ... Do any processing with the returned data ...

// Tell our view controller we are done
[self.delegate dataGrabberFinished:self];
}

然后确保 Foo 实现了 DataGrabberDelegate 协议(protocol)方法来处理每种情况。

最后,您的 DataGrabber 有一个 delegate属性(确保使用分配,而不是保留以避免保留循环):
@property (nonatomic, assign) id<DataGrabberDelegate> delegate;

当 NSURLConnection 异步加载在 DataGrabber 内完成时,它们会在上面列出的协议(protocol)中回调您的 UIViewController,以便您可以更新 UI。如果它是一个请求,理论上你可以摆脱 DataGrabber 并将其放在你的 View Controller 中,但我喜欢“分离我的关注点”——API 和 View Controller 保持分离。它生成了一个额外的层,但它将“文本处理代码”排除在 View Controller 之外(特别是对于 JSON 和 XML 解析代码)。

我已经成功完成了很多次 - 另一个关键是向用户提供一些页面正在加载的反馈是很好的 - 打开状态栏中的事件指示器,向他们显示 UIActivityIndi​​cator 等,然后当您的委托(delegate)回调返回成功或失败时,您将摆脱它。

最后,我写了一篇更详细的博客文章: Consuming Web APIs on the iPhone

关于iphone - 从网络上的数据抓取类返回数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3883747/

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