从网络数据抓取类返回数据?

2024-04-02

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

// 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 委托方法跳转。 FooClass 如何知道何时收到数据?


The 委托模式与严格的协议一起使用对此非常有用(这就是 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 协议方法来处理每种情况。

最后,您的 DataGrabber 有一个delegate属性(确保使用分配,而不是保留以避免保留循环):

@property (nonatomic, assign) id<DataGrabberDelegate> delegate;

当 NSURLConnection 异步加载在 DataGrabber 内部完成时,它们会按照上面列出的协议回调到您的 UIViewController,以便您可以更新 UI。如果这是一个请求,理论上您可以摆脱 DataGrabber 并将其放入视图控制器中,但我喜欢“分离我的关注点” - API 和视图控制器保持分离。它生成一个额外的层,但将“文本处理代码”保留在视图控制器之外(特别是 JSON 和 XML 解析代码)。

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

最后,我写了一篇关于此的更详细的博客文章:在 iPhone 上使用 Web API http://longweekendmobile.com/2010/10/15/how-to-consume-json-or-xml-web-apis-on-iphone-smoothly/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从网络数据抓取类返回数据? 的相关文章

  • 如何使用 XCode 7 在故事板中将视图高度设置为屏幕高度的百分比

    我需要设计如下图所示的视图 我尝试过固定高度 也尝试过紧凑宽度和常规高度以及常规宽度和紧凑高度 但这些场景对我不起作用 如何在故事板中将视图高度设置为屏幕高度的百分比 我正在使用 Xcode 7 Basically you need to
  • 在 Swift 3 中通过 Core Graphics 绘制文本

    背景 我正在使用 Core Graphics 的 UIImageView 上绘图 我想最终在核心图形绘图上绘制一个文本字符串 这个 hackingwithswift com https www hackingwithswift com ex
  • Apple 登录无法在 iOS 14 模拟器上运行

    当我尝试登录 iOS 14 中的模拟器时 加载旋转器会一直旋转 Apple 开发者论坛上有一个主题here https developer apple com forums thread 651533但没有解决方案 苹果也没有回应 我当然可
  • Siri 意图捐赠快捷方式最终出现错误

    我为 Siri 快捷方式创建了一个简单的意图 每当我尝试捐赠该意图时 都会出现以下错误 互动捐赠失败 Error Domain IntentsErrorDomain Code 1901 无法捐赠互动 意图 用户 标识符 06DE1A38 6
  • 是否可以自定义区域形状?核心位置

    例如 至少我想要一个正方形 矩形 道路的形状作为我的区域 不它不是 根据文档 目前唯一的区域类是 CLCircularRegion 显然是圆形 和 CLBeaconRegion 基于与 iBeacon 的接近度 未来苹果可能会添加对自定义形
  • 检查包含 URL 的字符串“http://”

    我正在尝试检查用户输入的 URL 但我正在与一些错误和警告作斗争 BOOL textFieldShouldReturn UITextField textField check http NSString check textField te
  • UIActionSheet 按钮的颜色

    如何更改 UIActionSheet 按钮的颜色 iOS 8 UIAlertController 如果您使用 UIAlertController 这非常简单 只需更改 UIAlertController 视图上的色调颜色即可 alertCo
  • UIViewControllerHierarchy不一致

    我正在尝试构建我的应用程序 有一次我推送了 UIViewController 然后收到此错误 我不太清楚为什么 UIViewControllerHierarchyInconsistency 原因 视图只能是 一次最多与一个视图控制器关联 查
  • UIStepper:如何知道用户单击了步进器的哪个按钮(减号或加号按钮)

    我如何知道用户点击了步进器的哪个按钮 减号或加号按钮 IBAction buttonStepper id sender int stepperValue self outletStepper value self label text NS
  • 升级到 SDK 4.1 后 Facebook 登录失败(总是 isCancelled)

    我已在 iOS 应用程序中将 Facebook SDK 从 3 21 1 升级到 4 1 已上线 我仔细遵循升级指南 并实施了新的登录方法 我使用的代码是 Facebook 文档中提供的代码 但是自从升级以来 每次我尝试登录 设备或模拟器
  • 为什么数据没有填充在我的自定义 ui 表视图单元格中

    我正在从服务器获取数据 我想将其放入我的自定义 UITableViewCell 中 这是故事板中的单元格 如您所见 有两件事 首选项标签 三个按钮 当我从服务器接收数据时 我这样做 override func tableView table
  • dispatch_async 在某个地方有滞后,找不到哪里。 NSLog有问题吗?

    所以我有这个代码 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY DEFAULT 0 Bunch of code NSLog Test 它立即运行并返回 ns
  • 使用 Swift 的核心数据瞬态值

    有谁知道 或者有一个例子 如何使用 Swift 处理核心数据瞬态值 我知道在属性之前使用 NSManaged 但无法弄清楚如何编写逻辑以使用 Swift 构建瞬态值 复选标记短暂的数据模型中特定属性的字段 例如sectionTitle 为该
  • 从两个相交的多边形创建新的 MKPolygon

    我知道确实有一个具体的问题讨论了这一点 但它有点老了 如果可能的话 我想了解更多技术性的知识 首先看一下这个截图 https www dropbox com s f94q3qaxrog0ec9 intersections png https
  • iOS 4.3 SDK - 在 3G 设备上调试

    目前有关 iOS 4 3 设备支持的信息还很少 然而 由于 iPhone 3G 设备 以及较旧的 iPod touch 设备 缺乏 4 3 Beta 版 许多人认为这可能是旧设备操作系统升级的终结 即使这个假设现在是错误的 但有一天它也不会
  • 从 NSArray 为 UITableView 创建索引

    我读过创建索引 uitableview 旁边的 a z 的最佳方法是设置一个 nsdictionaries 数组 其中每个字典对应一个部分 并且 rowValue 键包含一个行数组 NSDictionary headerTitle gt A
  • iOS 如何以编程方式简单返回到先前呈现/推送的视图控制器?

    如何以编程方式返回到先前的视图控制器 我找到了这个answer https stackoverflow com questions 28760541 programmatically go back to previous viewcont
  • 协议扩展,不符合协议

    我正在创建一个名为MyFramework含有LoginProtocol swift它有一些默认行为 import UIKit public protocol LoginProtocol func appBannerImage gt UIIm
  • Swift - 集成 GameCenter 以使用排行榜

    我正在用 Swift 制作一个游戏 我希望能够使用 GameCenter 发布用户的分数 以便可以看到所有用户的分数 然而 我花了一天的时间试图弄清楚如何做到这一点 但我没有找到任何有用的说明 我对 iOS 编程和 Swift 还很陌生 关
  • 获取 PHAsset 的本地文件路径

    我希望我的用户能够在 Instagram 上分享一张照片 并且我需要获取该照片的本地文件目录 不过 我将图像作为 PHAsset 获取 而不是 ALAsset 所有其他答案似乎都涵盖了这个主题 查看 PHAsset 文档 我没有看到 本地目

随机推荐