我有一个带有各种标签的ViewController。基于在html页面上运行的各种正则表达式解析逻辑,在运行时动态填充这些标签中的每一个。问题是,每个正则表达式匹配需要2-3秒,我有8个这样的标签,这意味着我必须在视图出现之前等待大约20-25秒!
这是一种非常糟糕的用户体验。我希望这能让用户减少痛苦,因此想要在处理正则表达式后获取数据时独立加载每个标签,而不是等待所有8个标签完成检索正则表达式匹配。
任何方式都可以在ios 5中实现?
答案 0 :(得分:2)
以下是一个例子:
- (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(我假设你使用这个数据库)很酷的多线程。