我在 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/