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

Iphone 需要一些关于异步任务的解释吗,iphone,ios,asynchronous,Iphone,Ios,Asynchronous,以下是我对iOS编程最不了解的一点。当我使用导航控制器推送视图时,在创建新视图时,我需要读取包含大量数据的文本文件,处理这些数据大约需要2-3秒 所以我想异步处理这个文件,以便同时显示ActivityIndicator 我已经在其他项目中使用了连接函数(connection,connectiondFinishLoading),但这里我想做的不同,因为数据已经在我的项目文件中,所以不需要连接 感谢您的帮助和建议。异步调用(我相信您已经知道)是在独立线程上调用的,而主线程继续进行。Objective

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

所以我想异步处理这个文件,以便同时显示ActivityIndicator

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

感谢您的帮助和建议。

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

好的,要在Objective-C中实现这一点,您需要有某种查询数据的方法。在核心数据或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)中读取文本文件,然后在主线程上调用回调方法,如果您提供一些加载/活动指示器来指示后面正在发生的事情,也会很好,谢谢,我想知道的最后一件事是,在这段代码中,与我的数据处理相对应的函数在哪里?这是
loginWithBlock
函数,很简单?没问题。一开始,积木看起来有点吓人,但一旦你掌握了它们的窍门,它们就变得异常可怕了。:)祝你好运!