这是我至少在iOS编程中理解的事情之一。当我使用导航控制器推送视图时,我需要读取包含大量数据的文本文件,这需要大约2-3秒的时间来处理,同时创建新视图。需要关于异步任务的一些解释
所以我想异步处理这个文件,以便同时显示一个ActivityIndicator。
我已经使用,在其他项目中,连接功能(connection
,connectionDidFinishLoading
...),但这里因为数据已经在我的项目文件,我想要做的是不同的,所以不需要连接。
感谢您的帮助和建议。
这是我至少在iOS编程中理解的事情之一。当我使用导航控制器推送视图时,我需要读取包含大量数据的文本文件,这需要大约2-3秒的时间来处理,同时创建新视图。需要关于异步任务的一些解释
所以我想异步处理这个文件,以便同时显示一个ActivityIndicator。
我已经使用,在其他项目中,连接功能(connection
,connectionDidFinishLoading
...),但这里因为数据已经在我的项目文件,我想要做的是不同的,所以不需要连接。
感谢您的帮助和建议。
一个异步调用(正如我相信你已经知道的那样)是在单独的线程上调用的东西,而主线程继续向前。 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。
你可以在后台线程(dispatch_async)中读取文本文件,然后在主线程上调用回调方法,如果你提供了一些负载/活动指示符,返回那里的东西 – ogres 2013-04-04 07:39:23