我知道块是ios中添加的最新功能之一。但我真的找到了
很难学习它。我见过有人在做以下事情
typedef void(^CallBackBlk) (NSString *);
@property(copy,nonatomic)CallBackBlk block;
和.m class
-(void)doSomething:(CallBackBlk )cb{
self.block=cb;
}
我从来不知道在这里将它分配给cb的用途是什么。我不能简单地做以下
-(void)doSomthing{
block(@"my string");
}
我实际上没有达到将块存储在实例变量中的目的。可以提供任何帮助
我举了一个例子。非常感谢任何帮助答案 0 :(得分:4)
在doSomething
方法中,block
来自哪里?
回答这个问题,你有理由。
实例变量只是放置东西的插槽。在那个插槽中没有什么可以开始。
在您的情况下,您可以实施:
-(void)doSomething:(CallBackBlk )cb{
cb();
}
但是,通常情况下,当您执行异步时会使用回调。例如,您可以这样做:
[myObject doSomething:^{
NSLog(@"did something");
}];
然后:
-(void)doSomething:(CallBackBlk)cb {
dispatch_async(... global concurrent queue ..., ^{
... do some work ...
cb();
});
}
也就是说,doSomething:
会在dispatch_async()
发生后立即返回。回调块用于回调,让您知道异步操作已完成。
当然,仍然不需要实例变量。拿那个做得更远的课;使它成为某种相对复杂的状态转换引擎。比如,你的平均互联网下载或计算重型模拟引擎。此时,将所有后台工作集中到一个方法中会过于复杂,从而推断回调块(可能会有多个;进度更新程序,完成块和/或错误块例如,实例变量允许类的实现更加干净地细分功能。
答案 1 :(得分:1)
将块存储在实例变量
中有什么用?
也许以后能够访问它?
答案 2 :(得分:1)
如果你想在稍后调用块之后调用块,那么你会这样做。
例如考虑管理下载的对象。您可能希望在下载完成时调用一个块(例如更新UI),但您不希望下载方法必须等到发生这种情况(因为它可能需要很长时间)。
答案 3 :(得分:0)
也许和使用的例子将有所帮助..
一个用于存储它作为变量的用途我发现如果你有多个视图都访问另一个视图(对我来说它是下一个视图上的地图)我使用了由前一个视图设置的块(设置了地图的默认位置,初始化标记等等,然后将其传递到下一个视图,在那里运行它,设置地图。块使用前一个视图的局部变量来访问某些属性很方便。它不是唯一的方法,但我发现这是一个很好的干净方式。
这是一个在mapview的viewDidLoad中运行的示例
if(setupMap){
setupMap(mapView);
}
if(gpsUpdate){
gpsUpdate(mapView);
}
if(addMarker){
addMarker(mapView);
}
现在如果分配了这些块(if语句检查它们是否为nil),它将运行它们并为地图进行适当的设置。并非每个视图都需要这样做,因此他们只会将需要完成的内容传递给地图视图。这使得地图视图非常通用,并且代码被重用了很多。写一次使用批次!
答案 4 :(得分:0)
要使用该块,请调用doSomething:
方法:
CallBackBlk laterBlock = ^(NSString *someString) {
NSLog(@"This code is called by SomeClass at some future time with the string %@", someString);
};
SomeClass *instance = [[SomeClass alloc] init];
[instance doSomething:laterBlock];
当您编写类的实现时,它可能会达到某种条件或完成操作,然后调用laterBlock
:
if (someCondition == YES) {
self.block("Condition is true");
}