我有一个带有各种标签的 ViewController。这些标签中的每一个都在运行时根据 html 页面上运行的各种正则表达式解析逻辑动态填充。问题是,每个正则表达式匹配需要 2-3 秒,而我有 8 个这样的标签,这意味着我必须等待大约 20-25 秒才能显示视图!
这是非常非常糟糕的用户体验。我希望这样可以减轻用户的痛苦,因此希望在处理正则表达式后获得数据时独立加载每个标签,而不是等待所有 8 个标签完成检索其正则表达式匹配。
任何方式都可以在 ios 5 中实现?
我有一个带有各种标签的 ViewController。这些标签中的每一个都在运行时根据 html 页面上运行的各种正则表达式解析逻辑动态填充。问题是,每个正则表达式匹配需要 2-3 秒,而我有 8 个这样的标签,这意味着我必须等待大约 20-25 秒才能显示视图!
这是非常非常糟糕的用户体验。我希望这样可以减轻用户的痛苦,因此希望在处理正则表达式后获得数据时独立加载每个标签,而不是等待所有 8 个标签完成检索其正则表达式匹配。
任何方式都可以在 ios 5 中实现?
这是一个例子:
- (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];
使用大中央调度 (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>]; }); });
}
如果你想使用它,你必须注意让你的代码分开。一部分进行数据加载工作,另一部分将数据设置为控件。你必须确保你的sqlite(我假设你使用这个数据库)在多线程中很酷。