Iphone viewDidLoad后的Cocoa Touch begin命令

Iphone viewDidLoad后的Cocoa Touch begin命令,iphone,multithreading,cocoa-touch,uiview,Iphone,Multithreading,Cocoa Touch,Uiview,我有一个应用程序,其中要求我在加载视图后连接到internet。但是,如果我将此代码放在viewDidLoad方法中,父视图将冻结,然后在连接到新视图后解冻。但是,我希望先加载新视图,然后启动连接。我尝试使用viewDidAppear:,但是我遇到了相同的问题 此外,在连接过程中是否会继续播放动画?用户界面会有响应吗?如果不是,多线程是一条出路吗 以下是我的一些代码: -(void)viewDidLoad { [super viewDidLoad]; //Do some othe

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

此外,在连接过程中是否会继续播放动画?用户界面会有响应吗?如果不是,多线程是一条出路吗

以下是我的一些代码:

-(void)viewDidLoad {
    [super viewDidLoad];
    //Do some other view initialization
    //Connect is a class I use to connect to the internet
    [Connect getData:someString];
}
当我将代码放入viewdid时,同样的事情也会发生

连接代码:

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

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

正如方法的名称所说,当执行
viewDidLoad
时,视图已经加载


通常,请确保使用连接到internet。永远不要阻塞主线程。

这比你想象的要容易

您所需要的只是一些线程管理。在视图上,您确实做到了:

[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

}

您会注意到,
UIViewController
viewDidLoad
方法说明:

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

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

为了回答您的其他问题,如果您按照您描述的方式发出网络请求,则在请求进行期间,动画将不会继续播放,并且,您不能保证UI会响应。这是因为网络请求将花费未知的时间。因此,如果您在主线程上发出请求,则主线程将在该时间段内被阻塞,不管需要多长时间


至于最后一个问题,多线程是一条出路吗?如其他人所述,处理此问题的最简单且可能最流行的方法是使用
initWithRequest:delegate:
初始化
NSURLConnection
。代表您的
UIViewController
Connect
类,或您希望符合
nsurlconnectionelegate
协议并使用
nsurlconnectionelegate
方法处理下载数据的任何类
NSURLConnection
将异步完成工作,并保持主线程自由处理动画、显示UI等。

我知道这对你的应用程序来说听起来是个坏主意。性能,但试着在两者之间给予延迟或睡眠,以检查其是否工作正常。稍后尝试实现前面所述的异步调用。

那么为什么在连接之后才显示视图?OK可能是因为您使用的是阻止主线程的同步连接。但是如果你不给我们看你的代码,我们怎么知道呢?(另外,加载视图并不意味着它也会被显示。但在您的案例中,这可能不是问题所在。)我在文档中添加了一个链接,解释了如何使用异步连接。这几乎总是您应该如何管理连接,而不是生成自己的线程。