【问题标题】:Is it possible to make a method operate sequentially?是否可以使方法按顺序运行?
【发布时间】:2012-08-21 10:45:39
【问题描述】:

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

在我的 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];

但是,在加载数组之前不会更新文本。导致“正在加载...”文本从未出现。因为它似乎是在数组被填充之后实现的。

同时 setHidden bool 设置为 YES,因此永远看不到标签。

我希望在方法开始填充数组之前更新 startLabel,因为这需要一些时间。即用于顺序操作的方法。

这可能吗?

谢谢

【问题讨论】:

    标签: iphone objective-c ios methods uilabel


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢@Jim,在我看到这个之前,我得到了上面的方法。这种方式会不会更有效率?
    【解决方案2】:

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

    见这篇文章:http://evilrockhopper.com/2010/01/iphone-development-keeping-the-ui-responsive-and-a-background-thread-pattern/

    你想要的功能是performSelectorInBackground

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

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

    performSelectorOnMainThread

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

    【讨论】:

    • 我认为这是正确的方法,但这并不能解决标签文本没有在正确的时间改变的问题。
    • 尝试使用 [startLabel setText:@"BLAH"];
    • 他已经在使用它(但使用的是 Objective-C 2.0 语法)。你的回答太笼统了,我认为你需要解释一下他将如何将后台线程状态与 UI 线程标签更新同步。
    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 2018-06-03
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2013-01-05
    相关资源
    最近更新 更多