如何在视图中加载/异步加载各种元素(标签中的数据)?

时间:2012-05-04 19:08:41

标签: ios

我有一个带有各种标签的ViewController。基于在html页面上运行的各种正则表达式解析逻辑,在运行时动态填充这些标签中的每一个。问题是,每个正则表达式匹配需要2-3秒,我有8个这样的标签,这意味着我必须在视图出现之前等待大约20-25秒!

这是一种非常糟糕的用户体验。我希望这能让用户减少痛苦,因此想要在处理正则表达式后获取数据时独立加载每个标签,而不是等待所有8个标签完成检索正则表达式匹配。

任何方式都可以在ios 5中实现?

3 个答案:

答案 0 :(得分:2)

  1. 创建一个单独的函数,用于计算所需的值 (无论如何,对于代码可读性/可维护性,你可能已经有了这个。)
  2. 在后台线程中运行此线程。
  3. 当您准备好实际设置文本时,请确保在主线程上执行此操作:
  4. 以下是一个例子:

    - (void)calculateLabelText {
        NSString *label1Text = // However you calculate this...
        dispatch_async(dispatch_get_main_queue(), ^(void) {
            self.label1.text = label1Text;
        });
    
        NSString *label2Text = // However you calculate this...
        dispatch_async(dispatch_get_main_queue(), ^(void) {
            self.label2.text = label2Text;
        });
    }
    

    在viewDidLoad中,添加:

    [self performSelectorInBackground:@selector(calculateLabelText) withObject:nil];
    

答案 1 :(得分:1)

使用Grand Central Dispatch(GCD)。它会为你处理队列和线程等。没有必要为一组发生一次的操作创建一个方法,无论如何,dispatch_async()比在后台线程上执行选择器更快,你可以保留现有的代码结构 - 你只需将它包起来在一个不会阻塞主线程的好的并发包中:)

  

//获取对全局并发队列的引用(无需创建自己的队列)。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
     

每个标签的正则表达式操作{

dispatch_async(queue, ^{
     // your regex here for one 

     // execute back in the main thread since UIKit only operates in the main thread.

    dispatch_async(dispatch_get_main_queue(), ^{
        [myLabel setText:<result of operations>];
    });
}); 
     

}

答案 2 :(得分:0)

如果您想使用它,您必须注意将代码分开。一部分进行数据加载工作,另一部分设置数据进行控制。并且你必须确保你的sqlite(我假设你使用这个数据库)很酷的多线程。