需要一些关于异步任务的解释

时间:2013-04-04 07:34:28

标签: iphone ios asynchronous

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

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

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

感谢您的帮助和建议。

1 个答案:

答案 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。