是否可以使方法顺序运行?

时间:2012-08-21 10:45:40

标签: iphone objective-c ios methods uilabel

我只在程序中包含了与此标签相关的代码。

在我的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在方法开始填充数组之前更新,因为这需要一些时间。即顺序操作的方法。

这可能吗?

谢谢

2 个答案:

答案 0 :(得分:1)

您不需要多线程,这会使事情过于复杂。问题是,在您的代码返回之前,UIKit不会更新用户界面,因此您要安排用户界面更新,加载阵列,然后将控制权返回给UIKit,然后UIKit执行用户界面更新。您需要做的是安排用户界面更新,将控制权返回给UIKit,然后在运行循环的下一次迭代中加载数组。为此,您可以使用零延迟的performSelector:withObject:afterDelay:,它将在下一个运行循环迭代中执行方法调用。这应该可以解决问题:

startLabel.text = @"Loading . .";
[self performSelector:@selector(fillArrays) withObject:nil afterDelay:0];

答案 1 :(得分:0)

您需要将数组加载到与GUI更新不同的线程上。

请参阅此文章:http://evilrockhopper.com/2010/01/iphone-development-keeping-the-ui-responsive-and-a-background-thread-pattern/

您想要的功能是 performSelectorInBackground

这样您的UI更新和后台工作可以同时完成。

您可以以类似的方式运行另一个更新主线程标签的函数:

performSelectorOnMainThread

这样你就可以在后台加载数组,并在主线程上更新你的UI(这很好,因为我认为UIKit不是线程安全的。