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


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

我的想法是在一个线程中启动请求,以便用户界面不会冻结。因此,您可以通过单击“取消”按钮来终止包括请求在内的整个线程。

使用Android它可以工作:服务器请求在“AsyncTask”和“onReturn()”中启动 - 方法我可以在服务器请求完成后立即做出反应。

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

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

非常感谢你!


2666
2017-11-24 17:44


起源



答案:


注意!

是一个非常古老的答案现在只在这里用于历史目的。

精彩的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
“创建异步请求”

它可能 - 几乎可以肯定 - 是任何平台上最令人惊讶的简单网络库。你快乐地做你所描述的事情是微不足道的。请享用。


5
2017-11-24 21:45





默认情况下,NSURLConnection是异步的,并且在建立连接,接收数据或完成整个请求时支持取消以及委托方法。

此外,数据传输在后台进行,以便UI保持响应。


2
2017-11-24 17:55





Cocoa的内置异步网络代码不是基于线程的,但适用于运行循环事件,但结果(异步连接)是相同的。

创建一个 NSURLConnection 同 +[NSURLConnection connectionWithRequest:delegate:]。您设置的代表将被告知连接的进度,并可随时取消 -[NSURLConnection cancel]


2
2017-11-24 17:56





查看 ASIHTTPRequest,具体来说,ASINetworkQueue子类,描述如下:

ASINetworkQueue

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

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


1
2017-11-24 18:03





有关使用建议的注意事项 +[NSURLConnection connectionWithRequest:delegate:] 是它应该只从iOS 4的主线程调用。

看到 http://blog.mugunthkumar.com/coding/ios4-issue-nsurlconnection-and-nsoperation/ 以此为例来说明如何处理这个问题。


1
2017-11-25 00:15