这是我对iOS编程最不了解的一件事。当我使用导航控制器推送视图时,我需要读取包含大量数据的文本文件,在创建新视图时需要大约2-3秒来处理。
所以我想异步处理这个文件,以便同时显示一个ActivityIndicator。
我已经在其他项目中使用了连接函数(connection
,connectionDidFinishLoading
...),但是我想要做的是不同的,因为数据已经存在于我的项目文件中,所以不需要连接。
感谢您的帮助和建议。
答案 0 :(得分: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。