Cocoa Touch开始命令AFTER viewDidLoad

时间:2011-09-18 14:19:30

标签: iphone multithreading cocoa-touch uiview

我有一个应用程序,在加载视图后我需要连接到互联网。但是,如果我将此代码放在viewDidLoad方法中,则父视图会冻结,然后在连接到新视图后解冻。但是,我希望新视图加载FIRST,然后启动连接。我尝试使用viewDidAppear:但是我遇到了同样的问题。

此外,在连接过程中是否会继续播放任何动画? UI会响应吗?如果没有,多线程是否可行?

以下是我的一些代码:

-(void)viewDidLoad {
    [super viewDidLoad];
    //Do some other view initialization
    //Connect is a class I use to connect to the internet
    [Connect getData:someString];
}

当我把代码放在viewDidAppear中时,会发生同样的事情。

连接代码:

NSMutableURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    NSHTTPURLResponse *response;
    NSError *error;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

另外,我忘了提到我在连接后也正在运行正则表达式。

4 个答案:

答案 0 :(得分:1)

正如方法名称所示,viewDidLoad执行时已加载视图。

通常,请务必使用asynchronous connections连接到互联网。永远不要阻塞主线程。

答案 1 :(得分:0)

比你想象的要容易。

您只需要一些线程管理。在视图上做了:

[NSThread detachNewThreadSelector:@selector(yourMethod:) toTarget:yourTarget withObject:yourObject];

以后在另一部分做:

- (void)yourMethod:(id)sender{
//download the info but do not update the GUI

[self performSelectorOnMainThread:@selector(updatingTheGUI:) withObject:yourObject waitUntilDone:NO]


}

- (void)updatingTheGUI:(id)sender{
//Update your GUI

}

答案 2 :(得分:0)

您会注意到viewDidLoadUIViewController方法documentation:{/ p>

  

...在控制器的视图加载到内存后调用。

这并不一定意味着在屏幕上显示视图后调用它。

要回答您的其他问题,如果您按照描述的方式提出网络请求,否则,动画将无法在请求进行过程中继续播放而不是,您无法保证用户界面会响应。这是因为网络请求将花费未知的时间。因此,如果您在主线程上发出请求,主线程将在该段时间内被阻止,无论需要多长时间。

至于最后一个问题,是多线程的方式吗?正如其他人所说,处理这个问题的最简单也可能是最流行的方法是初始化NSURLConnection initWithRequest:delegate:。委托是您的UIViewControllerConnect类,或者您想要符合NSURLConnectionDelegate协议的任何类,并使用NSURLConnectionDelegate方法处理下载的数据。 NSURLConnection将以异步方式完成工作,并保持主线程可以自由处理动画,显示UI等。

答案 3 :(得分:0)

我知道这对你的应用来说听起来不错。性能,但尝试延迟或睡觉之间,以检查它是否有效。稍后尝试按照之前的人的说法实现异步调用..