我想在我的应用程序中使用块,但我对块一无所知。谁能解释我应该如何以及为什么在我的代码中使用块?
3 回答
块是闭包(或 lambda 函数,但你喜欢叫它们)。他们的目的是使用块,程序员不必在全局范围内创建命名函数或提供目标操作回调,而是他/她可以创建一个未命名的本地“函数”,该函数可以访问其封闭的变量范围并轻松执行操作。
例如,当你想调度一个异步操作,比如一个视图动画,没有块,并且你想被通知竞争,你必须写:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:context:)];
.... set up animation ....
[UIView commitAnimations];
这是很多代码,而且它意味着存在一个有效self
指针 - 这可能并不总是可用(我在开发 MobileSubstrate-tweaks 时遇到过这样的事情)。因此,您可以使用 iOS 4.0 及更高版本的块来代替这个:
[UIView animateWithDuration:1.0 animations:^{
// set up animation
} completion:^{
// this will be executed on completion
}];
或者,例如,使用 NSURLConnection 加载在线资源... B. b. (块之前):
urlConnection.delegate = self;
- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)rsp
{
// ...
}
- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
// ...
}
// and so on, there are 4 or 5 delegate methods...
AB(纪元块):
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rsp, NSData *d, NSError *e) {
// process request here
}];
更容易,更清洁,更短。
块是一等函数,这是一种奇特的说法,块是常规的 Objective-C 对象。由于它们是对象,它们可以作为参数传递,从方法和函数返回,并分配给变量。块在 Python、Ruby 和 Lisp 等其他语言中称为闭包,因为它们在声明时封装了状态。块创建在其范围内引用的任何局部变量的 const 副本。在块之前,当你想调用一些代码并让它稍后给你回电时,你通常会使用委托或 NSNotificationCenter。这工作得很好,除了它把你的代码分散到各处——你在一个地方开始一个任务,然后在另一个地方处理结果。
例如,在视图动画中使用块可以让您不必执行所有这些操作:
[UIView beginAnimations:@"myAnimation" context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.5];
[myView setFrame:CGRectMake(30, 45, 43, 56)];
[UIView commitAnimations];
只需要这样做:
[UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[myView setFrame:CGRectMake(54, 66, 88, 33)];
}completion:^(BOOL done){
//
}];
Objective-C 类定义了一个将数据与相关行为相结合的对象。有时,仅表示单个任务或行为单元而不是方法的集合是有意义的。