2012-02-13 25 views
2

所以我有这个函数解析来自url字符串的数据并设置标签。查看后的调用函数有加载

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self parseAndSetLabels]; 
} 

的一点改进是,如果你有一个坏的方面,它可能需要一段时间,它看起来喜欢的应用程序冻结,但它实际上做parseAndSetLabels功能它动画视图前。

那么我如何使viewLoad和之后运行我的功能?

(像以该顺序)

-(void)main 
{ 
    [self viewDidLoad] 
    [self parseAndSetLabels]; 
} 
+1

有你的两个语句之间没有什么区别 - 它们将执行同样的事情。你需要做的是启动一个调用parseAndSetLabels的线程,然后在完成时发回一条消息。 – KevinDTimm 2012-02-13 14:31:40

+0

在你的情况下,你应该只在viewDidLoad中填充一些初始数据(也许可以从上一次会话缓存)并启动应该移动到另一个线程的parseAndSetLabels。这种方式GUI不会冻结。编辑:抱歉几乎重复的评论,我想它花了我8分钟键入它:) – 2012-02-13 14:38:48

回答

4

正如Nickolay O.所说,使用NSURLConnection与其委托方法异步,或者您可以在您的viewDidAppear:方法中调用parseAndSetLabels方法。
放置你的电话这最后的方法中,它会被称为每次出现的查看时间,但如果你不希望这样,您可以使用简单的布尔条件,在这个例子中只有一次调用此方法,如:

YourController.h 

@property (nonatomic) BOOL condition; 

YourController.m 

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.condition = YES; 
} 
-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (self.condition) 
    { 
     [self parseAndSetLabels]; 
     self.condition = NO; 
    } 
} 

但是,在你的情况下,NSURLConnection及其代表是最好的解决方案。

+0

这解决了我的问题,没有找到viewdidappear。 – captencrunch 2012-02-13 15:37:36

0

使用异步NSURLConnection的(或辅助线程)来代替。

1

如果没有看到您的parseAndSetLabels的内容,您很难过于具体,但通常您不应该在viewDidLoad代码中同步执行网络操作。您应该将标签设置为临时占位符,并启动异步调用,该异步调用需要在完成异步操作时执行的块。您应该从该异步块内设置标签的实际值。

0

您甚至可以在启动视图控制器之前下载并解析数据。所以你只需在解析数据的viewDidLoad方法中设置标签。 一旦你的应用程序在connectionDidfinishLoading(如果你使用异步模式)接收到信号,你就可以启动viewcontroller。

如果万一,您所说的视图控制器是根视图控制器,那么您使用的是对Web服务或异步调用的同步调用。但是您的输入将有所帮助。

1

如果您想与延迟的性能:

[self performSelector:@selector(something) withObject:nil afterDelay:0.0f];