ios高效开发--blocks相关
投稿于 被查看 22702 次 评论:271
ios高效开发--blocks相关
1、替换delegate 如果我们有2个viewController,a和b,当我们从a界面push到b后,在b上面触发了一些事件,这些时间又会影响到a界面上的内容。 上面是2个界面,当我们点击b界面的按钮3的时候,希望a界面上文字也相应的改变了 如 一般情况下我们会用delegate来实现。 代理很强大,不过代理它是程序的事件逻辑也变的复杂了。 来看下用block怎么处理。 一个block语句的定义类似于C的函数,有返回值,有0到多个参数,接下来属性声明,跟一般的属性声明差不多: typedef (^CallBack)(
@property(nonatomic, copy)CallBack callBack;
然后在b里面触发按钮事件的时候调用block,调用前最好先检查下是否为nil
1 - (IBAction)click2:(id)sender 2 { 3 if(self.callBack) 4 self.callBack(2); 5 } 6 7 8 - (IBAction)click3:(id)sender 9 { 10 if(self.callBack) 11 self.callBack(3); 12 }
现在完成了调用,具体的实现在哪呢,我们回到a当中,在a中执行跳转界面的地方,加上相关的实现。
SecondViewController *secondController = [[SecondViewController alloc]initWithNibName:
secondController.callBack = ^( self.clickBtnLabel.text = [NSString stringWithFormat:
[self.navigationController pushViewController:secondController animated:YES];
在是用block的时候,要注意所有权的问题,要小心产生循环,那样会导致资源无法释放。
例如在block中使用了一个指针,恰巧这个指针又是block的拥有者,那么会产生一个循环引用,他们都是强引用,无法释放。为了避免产生类似的问题,就需要用__weak标记block的拥有者。delegate和block在上面时候是用,要看具体情况,如果一个类的delegate里有很多方法,那还是放在delegate里实现吧。
2、系统定义的block
ios当中还有大量系统已经定义好的block,使用这些block实现特定的一些功能,能是整体代码更加简洁和高效。
例如遍历字典的时候,ios就提供了:
- ()enumerateKeysAndObjectsUsingBlock:( (^)( key, obj, BOOL *stop))block;
简单举个例子,我们要在字典中根据key来查找某个value,然后把value记录下来。
NSArray *keyArray = @[, , , , , NSArray *valueArray = @[, , , , , NSDictionary *enumDict = __block NSString *valueString = [enumDict enumerateKeysAndObjectsUsingBlock:^( key, obj, BOOL * ([key isEqualToString: valueString = *stop = }];
整个过程变的简单了。
还有在实现UIView动画的时候,block能让我们更加简单高效的实现很多特效。
[UIView animateWithDuration: animations:^ animateView.alpha = } completion:^ animateView.alpha = }];
这段代码实现了view透明度从1.0变到完全透明,用时0.5秒,当动画结束后重新显示view。
用户评论