0

这是我对 iOS 编程了解最少的事情之一。当我使用导航控制器推送视图时,在创建新视图时,我需要读取包含大量数据的文本文件,处理大约需要 2-3 秒。

所以我想异步处理这个文件,以便同时显示一个 ActivityIndi​​cator。

我已经在其他项目中使用过连接函数(connection... connectionDidFinishLoading),但在这里我想要做的是不同的,因为数据已经在我的项目文件中,所以不需要连接。

感谢您的帮助和建议。

4

1 回答 1

1

异步调用(我相信您已经知道)是在单独的线程上调用的东西,而主线程继续前进。Objective-C 以这种方式运行是因为如果调用是同步进行的,那么 UI(以及与此相关的所有其他内容)将简单地挂起,直到加载数据。

好的,所以要在 Objective-C 中执行此操作,您需要有某种方法来查询您的数据。如果它预加载在 Core Data 或 SQLite 中,它或多或少与被调用的方法相同。

有很多方法可以处理这个问题。我更喜欢积木,因为它们很简单。

[MBProgressHUD showHUDAddedTo:self.view animated:YES];
[User loginWithBlock:^(id responseObject, NSError *error) {
    if (!error) {
        NSLog(@"response object (the data): %@", responseObject);
        [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
    }
}];

仅供参考,MBProgressHUD 是活动指示器。

所以,让我们分解一下。活动指示器被分配,并显示在视图中,并一直保留到块被调用,直到加载数据的任务完成后才会被调用。数据加载完成后,该块将发送 responseObject(您的数据),并隐藏活动指示器。

就那么简单!

编辑:

这实际上更像是一个附加组件,但无论如何。

要在下面回答您的评论,拨打电话或处理“数据处理”,该loginWithBlock:功能是作为它自己的功能构建的。

+ (void)loginWithBlock:(ObjectResultBlock)block
{
    [[APIClient sharedClient] postPath:@"login" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)
     {
         if (block) block(responseObject, nil);
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         if (block) block(nil, error);
     }];
}

在创建此函数的头文件中声明块:

typedef void(^ObjectResultBlock)(id responseObject, NSError *error);

这个特殊的例子是使用 AFNetworking。但正如我之前所说,这一切看起来都相对相同。

那么,让我们分解一下...

loginWithBlock:被调用,因此您执行 APIClient 调用,该调用要么成功,要么失败。在一个完美的世界中,它会成功,然后您将 responseObject 传递给该块。

于 2013-04-04T07:42:41.890 回答