2013-04-04 88 views
0

这是我至少在iOS编程中理解的事情之一。当我使用导航控制器推送视图时,我需要读取包含大量数据的文本文件,这需要大约2-3秒的时间来处理,同时创建新视图。需要关于异步任务的一些解释

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

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

感谢您的帮助和建议。

+0

你可以在后台线程(dispatch_async)中读取文本文件,然后在主线程上调用回调方法,如果你提供了一些负载/活动指示符,返回那里的东西 – ogres 2013-04-04 07:39:23

回答

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。

+0

好的,谢谢很多,而最后一件事我想知道在这段代码中我的数据处理所对应的函数应该是或应该是什么?它只是'loginWithBlock'函数? – Rob 2013-04-04 07:47:22

+0

为了清晰起见,请参阅我的编辑。 – jakenberg 2013-04-04 08:09:05

+0

看到了,非常感谢。 – Rob 2013-04-04 08:12:58

相关问题