如何在Objective-C中获得未调用方法的返回值

|| 我正在使用ASIHTTPRequest通过我的iOS应用程序中的一个名为SubmitUserCredentials的方法执行异步URL请求。可以很好地发送请求,但是问题是,当从服务器返回响应时,会设置ASIHTTPRequest,以便另一个方法requestFinished接收并返回它。 首先,当我是从视图控制器运行的方法SubmitUserCredentials时,如何掌握requestFinished返回的服务器响应?     
已邀请:
        您将ViewController设置为符合ASIHTTPRequestDelegate协议:
@interface MyViewController : UIViewController <ASIHTTPRequestDelegate>
然后,您实现
-(void) requestFinished(ASIHTTPRequest *)request;
ViewController的实现中的方法。现在,当请求完成时,将调用ViewController中的requestFinished:方法。如果您需要将信息与请求一起传递并在requestFinished:方法中可用,则可以将ASIHTTPRequest的userInfo属性设置为所需的值,并将其在requestFinished的request参数中可用: 对评论的回应: 如果您愿意在收到响应之前阻塞线程,则可以使用startSynchronous方法(来自ASI网站http://allseeing-i.com/ASIHTTPRequest/How-to-use的代码):
[request startSynchronous];
NSError *error = [request error];
if (!error) {
  NSString *response = [request responseString];
}
这样,您的submitUserCredentials方法将在服务器响应时坐下来等待,但它将服务器响应返回给该方法。如果在等待响应时阻止UI不能为您服务(并且可能无法),则可以启动一个新线程来运行您的SubmitUserCredentials方法,然后从那里调用startSynchronous:
[NSThread detachNewThreadSelector:@selector(submitUserCredentials:)
        toTarget:self withObject: credentials];
    
        您可能要在这里提出一些不同的要求。我不知道是哪一个。因此,我将尝试回答所有这些问题。 您不知道何时叫ѭ4when吗?您是否这样设置请求的委托人?
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
如果这样做了,那么对于上面的
self
所指的任何内容,都应该实现
requestFinished:
方法。 您不确定如何在
requestFinished:
中获取响应字符串吗?在这种情况下,解决方案很简单:
- (void)requestFinished:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   // Use when fetching binary data
   NSData *responseData = [request responseData];
}
即请求的
responseString
responseData
会为您提供所需的内容。 还是说您想以某种方式处理ѭ12中的响应(可能是因为此方法的局部变量中有很多上下文)?如果是这样,那么最好的选择可能是使用块:
- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@\"http://allseeing-i.com\"];
   __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setCompletionBlock:^{
      // Use when fetching text data
      NSString *responseString = [request responseString];

      // Use when fetching binary data
      NSData *responseData = [request responseData];
   }];
   [request setFailedBlock:^{
      NSError *error = [request error];
   }];
   [request startAsynchronous];
}
还是问题在于您希望ASIHTTPRequest以同步方式工作?在这种情况下,您可以执行以下操作:
- (IBAction)grabURL:(id)sender
{
  NSURL *url = [NSURL URLWithString:@\"http://allseeing-i.com\"];
  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  [request startSynchronous];
  NSError *error = [request error];
  if (!error) {
    NSString *response = [request responseString];
  }
}
但是不建议您这样做。这样做会挂起应用程序的主线程(假设您在主线程中进行调用),这不是一件好事。如果这确实是您要找的答案,那么您可能需要阅读事件驱动的编程。 注意:上面所有代码示例都是从ASIHTTPRequest的出色的“如何使用它”文档页面复制而来的。     

要回复问题请先登录注册