3

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

这是非常非常糟糕的用户体验。我希望这样可以减轻用户的痛苦,因此希望在处理正则表达式后获得数据时独立加载每个标签,而不是等待所有 8 个标签完成检索其正则表达式匹配。

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

4

3 回答 3

2
  1. 创建一个单独的函数来计算您需要的值。
    (为了代码的可读性/可维护性,你可能已经有了这个。)
  2. 在后台线程中运行此线程。
  3. 当您准备好实际设置文本时,请确保在主线程上执行此操作:

这是一个例子:

- (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];
于 2012-05-04T19:25:15.203 回答
1

使用大中央调度 (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>];
    });
}); 

}

于 2012-05-04T19:24:54.353 回答
0

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

于 2013-01-25T03:39:38.223 回答