ios - 访问web时,block和不block有什么区别

标签 ios networking asihttprequest objective-c-blocks

我在 document 中使用 ASIHTTPRequest 框架,第二个和第三个例子在用法优点缺点方面有什么区别?

第二个示例(创建异步请求):

- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
// Use when fetching text data
NSString *responseString = [request responseString];

// Use when fetching binary data
NSData *responseData = [request responseData];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}

第三个例子(使用 block )

- (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];
}

最佳答案

iOS 中的 block 是 Concurrent Programming 的一部分

当您想要创建可以作为 传递的工作单元(即代码段)时,您可以使用 block 。 block 通常用于编写回调

通常,使用 block 不会反射(reflect)在不同的应用程序行为中。语法上的区别是,当使用 block 时,您不需要为异步请求定义请求委托(delegate)或实现委托(delegate)方法(例如 -requestFinished:-requestFailed:) .

优点之一是在完成 block 中访问局部方法变量,因为 block 中的函数表达式可以引用并且可以保留对局部变量的访问(如变量url在您的方法 -grabURLInBackground: 或您的方法中定义的任何其他局部变量中)。

第二个冒险是使用嵌套请求调用。例如,您可能需要按顺序执行几个请求,如果没有 block ,您将需要为每个请求定义一个单独的委托(delegate)方法回调,这可能会降低代码的可读性。

block 允许您在调用点编写代码,这些代码稍后在方法实现的上下文中执行,当您习惯使用它们时,这可能非常有用。

Apple Blocks Programming Topis 中提到了使用 block 时要避免的一些模式

关于ios - 访问web时,block和不block有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7343268/

相关文章:

ios - 在其 View 加载之前设置 UITabBarItem 属性?

ios - 在 Xcode 6 中移动项目

java - 为什么ServerSocket对象的accept方法返回具有不同端口的Socket对象

java自动代​​理配置

iphone - 处理 ASIHTTPRequest 多个请求

ios - 二元运算符 - 不能应用于字符串类型的操作数!和诠释

ios - 根据 UIScrollView 的高度设置 UIView 的高度

networking - 如果 TCP 是面向连接的,为什么数据包会遵循不同的路径?

android - 在 Android 上使用亚马逊简单存储服务 (S3)

iphone - 从 block 返回 UIImage