使用块的目的是什么

时间:2012-08-29 11:33:23

标签: objective-c cocoa-touch block objective-c-blocks

我想在我的应用程序中使用块,但我对块没有任何了解。任何人都可以解释我在代码中使用块的方式和原因吗?

3 个答案:

答案 0 :(得分:30)

块是closures (or lambda functions,但是你想打电话给它们。它们的目的是使用块,程序员不必在全局范围内创建命名函数或提供目标操作回调,而是他/她可以创建一个未命名的本地“函数”,它可以访问其封闭的变量范围并轻松执行操作。

例如,当你想要e。 G。调度一个异步操作,这样一个视图动画,没有块,你想通知竞争,你必须写:

[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...

一个。 B.(Anno Blocks):

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rsp, NSData *d, NSError *e) {
   // process request here
}];

更容易,更清洁,更短。

答案 1 :(得分:14)

引用Ray Wenderlich tutorial

  

块是一流的功能,这是一种奇特的说法   块是常规的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){
    //
}];

答案 2 :(得分:0)

Objective-C类定义了一个将数据与相关行为相结合的对象。有时,仅表示单个任务或行为单元而不是方法集合是有意义的。