我只在程序中包含了与此标签相关的代码。
在我的viewDidLoad方法中我有
[startLabel setHidden:NO];
startLabel.text = @"Touch to Begin";
在touchesBegan方法中,我有
startLabel.text = @"Loading . .";
[self fillArrays];
然后在填充数组方法中,我填充数组,然后隐藏标签 -
self.myArray = [NSArray arrayWithObjects:
[UIImage imageNamed:@"Frame 1.png"], . .etc etc etc . . . nil]];
[startLabel setHidden:YES];
但是,在加载数组之前不会更新文本。导致“Loading。”文本永远不会出现。因为它似乎是在数组填满后实现的。
同时setHidden bool设置为YES,因此永远不会看到标签。
我希望startLabel在方法开始填充数组之前更新,因为这需要一些时间。即顺序操作的方法。
这可能吗?
谢谢
答案 0 :(得分:1)
您不需要多线程,这会使事情过于复杂。问题是,在您的代码返回之前,UIKit不会更新用户界面,因此您要安排用户界面更新,加载阵列,然后将控制权返回给UIKit,然后UIKit执行用户界面更新。您需要做的是安排用户界面更新,将控制权返回给UIKit,然后在运行循环的下一次迭代中加载数组。为此,您可以使用零延迟的performSelector:withObject:afterDelay:
,它将在下一个运行循环迭代中执行方法调用。这应该可以解决问题:
startLabel.text = @"Loading . .";
[self performSelector:@selector(fillArrays) withObject:nil afterDelay:0];
答案 1 :(得分:0)
您需要将数组加载到与GUI更新不同的线程上。
您想要的功能是 performSelectorInBackground
这样您的UI更新和后台工作可以同时完成。
您可以以类似的方式运行另一个更新主线程标签的函数:
performSelectorOnMainThread
这样你就可以在后台加载数组,并在主线程上更新你的UI(这很好,因为我认为UIKit不是线程安全的。