我想启动一个服务器请求,你可以取消。
我的想法是在一个线程中启动请求,以便用户界面不会冻结。因此,您可以通过单击“取消”按钮来终止包括请求在内的整个线程。
使用Android它可以工作:服务器请求在“AsyncTask”和“onReturn()”中启动 - 方法我可以在服务器请求完成后立即做出反应。
如何在iOS上使用Objective-C实现这一点?
我的第一次尝试是“NSInvocationOperation”。您可以取消操作,但在请求完成且结果可用时很难处理。我认为NSInvocationOperation不是我的问题的解决方案。
你会推荐给我吗? NSThread是我的正确选择吗?
非常感谢你!
注意!
钍是一个非常古老的答案现在只在这里用于历史目的。
精彩的ASIHttpRequest库不再存在;技术现在完全不同了。
使用ASIHttpRequest执行此操作简直令人难以置信。
(异步非常简单,没有理由你不会异步地执行它。)
这里有一些粗略的摘录可能会让你开始。
...
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
}
真的不容易。你基本上只是输入字段和值。
根据您的问题,以下是取消“飞行中”请求的方法...只需将委托设置为nil然后“取消”它。
[myRequest setDelegate:nil];
[myRequest cancel];
[myRequest release];
ASIHttpRequest是“奇迹库”。如果您是iOS新手,ASIHttpRequest只是最常用的第三方库。从本质上讲,300,000个iPhone应用程序中的每个iPhone应用程序都使用它。
如果可能的话,可以为这个人捐出几块钱 - 如果他停止支持那个库,那么就会有100,000名iPhone程序员受到攻击!
文档是微不足道的,孩子可以遵循它:
http://allseeing-i.com/ASIHTTPRequest/How-to-use
“创建异步请求”
它可能 - 几乎可以肯定 - 是任何平台上最令人惊讶的简单网络库。你快乐地做你所描述的事情是微不足道的。请享用。
默认情况下,NSURLConnection是异步的,并且在建立连接,接收数据或完成整个请求时支持取消以及委托方法。
此外,数据传输在后台进行,以便UI保持响应。
Cocoa的内置异步网络代码不是基于线程的,但适用于运行循环事件,但结果(异步连接)是相同的。
创建一个 NSURLConnection
同 +[NSURLConnection connectionWithRequest:delegate:]
。您设置的代表将被告知连接的进度,并可随时取消 -[NSURLConnection cancel]
。
查看 ASIHTTPRequest,具体来说,ASINetworkQueue子类,描述如下:
ASINetworkQueue
NSOperationQueue的子类
可用于跟踪进度
多个请求。
我只使用ASIHTTPRequest将单个同步请求直接下载到磁盘,这很容易实现,但我听说过使用队列同时管理多个异步服务器请求的好报告。
有关使用建议的注意事项 +[NSURLConnection connectionWithRequest:delegate:]
是它应该只从iOS 4的主线程调用。
看到 http://blog.mugunthkumar.com/coding/ios4-issue-nsurlconnection-and-nsoperation/ 以此为例来说明如何处理这个问题。