1 什么是block
动画效果是IOS界面重要的特色之一,其中CAAnimation是所有动画对象的抽象父类,作为新人,使用较多的是UIView下的动画方法(类方法)。使用UIView下的动画,有下面几个方法。
方法一:设置beginAnimations
其中memberView为需要添加的子视图的视图,mivc.view为子视图,在使用的时候,需要将这两个地方替换
需要注意的是,一定要使用[UIView commitAnimations];动画才会生效
通过[UIView setAnimationDuration:1]; 设置持续时间。
方法二:
在IOS4.0后,我们有了新的方法,+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion,依然是UIView的类方法,但使用到了Block对象,Block对象是一组指令,可以传递(像变量一样),可以把它想像成C语言的函数指针。
[UIView transitionWithView:self.view duration:0.2 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ [self.view addSubview:yellowView.view]; } completion:NULL];
B:
block不同其它变量的原因在于它不是一个单一变量, 而是一个方法,
我们要传递的是一个代码块,并且这个代码块可以存在参数,
这个参数并不是在定义block的时候就赋予值, 而是我们在实际运行block的时候才赋予值.
因此对于有参数的block,当我们传递过去的时候, 它的需要接收方提供相应的参数才能运行,
这么做我们就可以在A类为B类将来会发生的事件提前做好处理的方法,即使我们还没有这些事件的具体参数.
某种意义上将这样就不需要两者之间的委托关系.
委托关系就是B类发生一个事件后,通知A类,让A类再针对这个事件进行一些处理
而使用block,则是A已经提前将这个事件的处理方法告诉了B类, 等时间发生的时候, B类无需通知A类, 直接运行实现设置好的处理方法(block)即可.
如果你在运行一个方法的时候又想告诉这个方法在某一特定情况你还要怎么做的话, 就可以使用Block.
D:
GCD:
GCD主要使用block来代替委托模式,使程序变得简洁,同时运行效率也得到提高.
static int clickNum = 0; self.Mylabel = [[UILabel alloc]init]; while (clickNum <20) { dispatch_async(dispatch_get_main_queue(), ^{ self.Mylabel.text = [NSString stringWithFormat:@"%d",clickNum++];//UI的绘制必须在主线程中 }); [NSThread sleepForTimeInterval:1]; }
ARC和非ARC中block的区别:
ARC下Block何时会从栈自动被复制到推, 以及__block和__weak的使用问题
demo下载(还有点问题,暂时不提供下载)