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

Man*_*nni 11 iphone multithreading objective-c request ios

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

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

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

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

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

非常感谢你!

Fat*_*tie 5

注意!

是一个非常古老的答案现在只是为了历史目的.

精彩的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
    }
Run Code Online (Sandbox Code Playgroud)

真的不容易.你基本上只是输入字段和值.

根据您的问题,这里是您取消"飞行中"请求的方法 ...只需将委托设置为nil然后"取消"它.

  [myRequest setDelegate:nil];
  [myRequest cancel];
  [myRequest release];
Run Code Online (Sandbox Code Playgroud)

ASIHttpRequest是"奇迹库".如果您是iOS新手,ASIHttpRequest只是最常用的第三方库.从本质上讲,300,000个iPhone应用程序的每个iPhone应用程序都使用它.

如果可能的话,一定要向这个人捐出几块钱 - 如果他停止支持那个库,那么就会有100,000名iPhone程序员受到攻击!

文档是微不足道的,孩子可以遵循它:
http://allseeing-i.com/ASIHTTPRequest/How-to-use
"创建异步请求"

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