如何在iPhone应用程序中同时执行两项任务?(穿线?)

如何在iPhone应用程序中同时执行两项任务?(穿线?),iphone,multithreading,uilabel,Iphone,Multithreading,Uilabel,情况: 在我的应用程序的某个地方,我开始从我的服务器下载数据。在开始下载之前,我想更新一个UILabel,上面写着@“正在下载…”。下载结束后,将其设置回空白。 问题:似乎下载占据了所有计算机的注意力,UILabel直到最后才更新(下载已经结束),因此被设置为空白(或者,永远不会实时可见) 问题: 如何在下载之前简单地更新UILabel以显示“正在下载”如果您使用NSURLRequest->NSURLConnection和NSURLConnection的委托方法,这将在后台执行下载,并将传入

情况:
在我的应用程序的某个地方,我开始从我的服务器下载数据。在开始下载之前,我想更新一个UILabel,上面写着@“正在下载…”。下载结束后,将其设置回空白。


问题:
似乎下载占据了所有计算机的注意力,UILabel直到最后才更新(下载已经结束),因此被设置为空白(或者,永远不会实时可见)


问题:

如何在下载之前简单地更新UILabel以显示“正在下载”

如果您使用
NSURLRequest
->
NSURLConnection
和NSURLConnection的委托方法,这将在后台执行下载,并将传入数据通知委托人。这也将允许您显示进度

如果使用
NSURLRequest
->
NSURLConnection
和NSURLConnection的委托方法,这将在后台执行下载,并将传入数据通知委托人。这也将允许您显示进度

Naaa。无论如何谢谢你,但我不会再走那条路了。不久前我试着这样做,但却陷入了痛苦的世界。所以,我现在只想坚持我的[NSString stringFromContentsOfURL:URL]或其他方法。我应该看看线程吗?不,你应该看看NSURLRequest和NSURLConnection。这就是它们的设计目的。你陷入痛苦的世界是一个完全不同的问题;提出一个包含您的痛苦的问题。我想使用NSURLConnection plus委托比自己完成所有线程更容易。苹果提供的示例代码应该足够清晰。另外:请记住UIKit不是线程安全的。因此,所有的UI操作都应该在主线程上执行。是的,但我讨厌阅读无聊的东西。噢,好吧。我只是头脑冷静而已。无论如何谢谢你,但我不会再走那条路了。不久前我试着这样做,但却陷入了痛苦的世界。所以,我现在只想坚持我的[NSString stringFromContentsOfURL:URL]或其他方法。我应该看看线程吗?不,你应该看看NSURLRequest和NSURLConnection。这就是它们的设计目的。你陷入痛苦的世界是一个完全不同的问题;提出一个包含您的痛苦的问题。我想使用NSURLConnection plus委托比自己完成所有线程更容易。苹果提供的示例代码应该足够清晰。另外:请记住UIKit不是线程安全的。因此,所有的UI操作都应该在主线程上执行。是的,但我讨厌阅读无聊的东西。噢,好吧。我只是很固执。你还有一个额外的“恩斯”:)。还有,他需要一个自动释放池吗?嘿,谢谢。但是--如何为@selector(下载)传入参数??它需要一个NSSTRING,这将泄漏,除非在调用
-didFinishDownload
或所有下载操作完成后,有办法
释放
操作队列
。更新以显示向下载传递参数。还有,是的,这是泄漏。将operationQueue设置为成员变量。您还有一个额外的“ance:)。还有,他需要一个自动释放池吗?嘿,谢谢。但是--如何为@selector(下载)传入参数??它需要一个NSSTRING,这将泄漏,除非在调用
-didFinishDownload
或所有下载操作完成后,有办法
释放
操作队列
。更新以显示向下载传递参数。还有,是的,这是泄漏。将operationQueue设置为成员变量。
label.text = @"Downloading";
NSOperationQueue *operationQueue = [[NSOperationQueue]alloc]init];
NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download) object:@"http://www.google.com"];
[operationQueue addOperation:operation];
[operation release];


- (void)download:(NSString *)url
{
    // do the download
    [self performSelectorOnMainThread:@selector(didFinishDownload) withObject:nil waitUntilDone:NO];
}

- (void)didFinishDownload
{
   label.text = @"";
}