Objective-C:线程中的服务器请求(如Android中的AsyncTask)

我想启动一个服务器请求,你可以取消。

我的想法是在一个线程中启动请求,以便用户界面不会冻结。 所以你可以通过点击“取消”button来杀死包括请求在内的整个线程。

使用Android它的工作原理:服务器请求在“AsyncTask”和“onReturn()”方法中开始,只要服务器请求完成,我可以立即做出反应。

我如何在iOS上使用Objective-C来实现这个function? 我第一次尝试是“NSInvocationOperation”。 您可以取消该操作,但是当请求完成并且结果可用时很难处理。 我认为NSInvocationOperation不是我的问题的解决scheme。

你会推荐给我吗? NSThread是我的正确select吗?

非常感谢你!

注意!

是一个非常古老的答案,现在这里只是为了历史的目的。

精彩的ASIHttpRequest库不再存在; 技术现在完全不同了。


用ASIHttpRequest做这件事简直难以置信。

(asynchronous非常简单,没有理由不会asynchronous执行。)

这里有一些粗略的摘录,可能会让你开始。

... ASIFormDataRequest *request; ... NSURL *url = [NSURL URLWithString:@"https://blah.blah/blah.cgi?blah"]; request = [ASIFormDataRequest requestWithURL:url]; [request setPostValue:@"fred" forKey:@"username"]; [request setPostValue:@"flint" forKey:@"passie"]; [request setPostValue:@"stone" forKey:@"town"]; // send up data... [request setData:[NSData dataWithBytes:blah length:blah] forKey:@"thefile"]; // or perhaps something like... [request setData:imageData withFileName:@"blah.png" andContentType:@"image/jpeg" forKey:@"photoimage"]; [request setDelegate:self]; [request setDidFinishSelector:@selector(postingDone:)]; [request setDidFailSelector:@selector(postingDoneProblem:)]; [request startAsynchronous]; ... -(void) postingDone:(ASIHTTPRequest *)request { // it worked } -(void) postingDoneProblem:(ASIHTTPRequest *)request { // failed } 

真的没有那么容易了。 你基本上只是input字段和值。

根据你的问题,这里是你如何取消一个“在飞行中”的请求 …只是设置委托为零,然后“取消”它。

  [myRequest setDelegate:nil]; [myRequest cancel]; [myRequest release]; 

ASIHttpRequest是“奇迹图书馆”。 如果你是iOS新手,ASIHttpRequest是最常用的第三方库。 实质上,30万iPhone应用程序的每个iPhone应用程序都使用它。

如果可能的话,应该向这个家伙捐几块钱 – 如果他停止支持那个库,那么就有十万个iPhone程序员被疯狂地攻击!

文件是微不足道的,一个孩子可以遵循它:
http://allseeing-i.com/ASIHTTPRequest/How-to-use
“创buildasynchronous请求”

它可能 – 几乎可以肯定 – 在任何平台上最惊人的简单的networking库。 快乐地做你所描述的是微不足道的。 请享用。

NSURLConnection在默认情况下是asynchronous的,当连接build立,数据已经收到或者整个请求已经完成时,NSURLConnection支持取消和委托方法。

此外数据传输发生在后台,使用户界面保持响应。

Cocoa的内置asynchronousnetworking代码不是基于线程的,但可以与运行循环事件一起工作,但结果(asynchronous连接)是相同的。

+[NSURLConnection connectionWithRequest:delegate:]创build一个NSURLConnection 。 您设置的代表将被通知有关连接的进度,并可随时通过-[NSURLConnection cancel]

检查ASIHTTPRequest ,具体来说,ASINetworkQueue子类,它描述为:

ASINetworkQueue

NSOperationQueue的一个子类,可用于跟踪多个请求的进度。

我只使用ASIHTTPRequest来将单个同步请求直接下载到磁盘,这很容易实现,但是我听说了使用队列同时pipe理多个asynchronous服务器请求的良好报告。

关于使用+[NSURLConnection connectionWithRequest:delegate:]的build议,需要注意的一点是它只能从iOS 4的主线程调用。

请参阅http://blog.mugunthkumar.com/coding/ios4-issue-nsurlconnection-and-nsoperation/了解如何处理这个问题。