菜单

4166am金沙下载Block使用的简单总结,block使用总结

2019年9月16日 - 4166am金沙下载
4166am金沙下载Block使用的简单总结,block使用总结

1>.有两个控制器,主动传值或者提供方法的控制器A,接受值的控制器B2>.让A控制器typedef
void(),然后copy一个myBlock类型的属性:@property(nonatomic ,copy) myBlock

一.Block简单的使用

使用Block在两个界面之间传值

4166am金沙下载 1

block;3>.在B控制器中创建A控制器,然后调用A控制器的方法4>.在A控制器方法中,记录block:self.block

block;5>.在合适的地方调用block:self.block(poiResultList.poiInfoList);6>.调用以后block参数里边已经有值,这个时候在B控制器中调用A控制器的方法中参数block开始执行,并且block中参数也已经有值.

1>.谁要传值,谁声明和定义block以及把block作为参数的方法2>.传值方记录下来block,在合适的时候调用3>.接受值方,调用方法,等传值方调用block的时候才会在代码块中拿到block传过来的参数值.

1.block当作参数来传递

1. 在 B 控制器的.h文件中定义声明Block属性

typedef void (^MyBlock)(NSString *);

#import”TSYBaiduTool.h”

 @interfaceTSYBaiduTool() @property(nonatomic,copy) Blockblock; /** poi检索对象*/ @property(nonatomic,strong)BMKPoiSearch*searcher; @end @implementationTSYBaiduTool single_implementation(TSYBaiduTool) - getPoiWithCeneter:(CLLocationCoordinate2D)centerkey:(NSString*)key Result:block{ //记录block self.block=block; //初始化检索对象 _searcher=[[BMKPoiSearch alloc] init]; _searcher.delegate=self; //发起检索 BMKNearbySearchOption*option = [[BMKNearbySearchOption alloc] init]; option.pageIndex=0; option.pageCapacity=20; option.location= center; option.keyword= key; BOOLflag = [_searcherpoiSearchNearBy:option]; if{NSLog(@"周边检索发送成功");}else {NSLog(@"周边检索发送失败");} 

如下定义一个没有返回值无参数的block,并把它作为参数,让系统调用,注意:这里是系统在调用,不是我们调用

@interface BViewControl: UIViewController

@property (nonatomic, copy) MyBlock returnBlock;

@end

第一行代码是为要声明的Block重新定义了一个名字 MyBlock

这样,下面在使用的时候就会很方便。

第三行是定义的一个Block属性

#import”TSYBaiduTool.h”

 @interfaceTSYBaiduTool() @end @implementationTSYBaiduTool - addAnnotationCenter:(CLLocationCoordinate2D)centertitle:(NSString*)title subTitle:(NSString*)subTile toMapView:(BMKMapView*)mapView{ //添加一个PointAnnotation BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc] init]; annotation.coordinate= center; annotation.title= title; annotation.subtitle= subTile; [mapViewaddAnnotation:annotation]; }

4166am金沙下载 2

2.  B控制器.m文件中

– (void)viewWillDisappear:(BOOL)animated {

if (self.MyBlock ) {

self.MyBlock(self.inputTF.text);

}

}

self.inputTF.text 是回传的字符串

#import”TSYBaiduTool.h”

 @interfaceTSYBaiduTool() @end @implementationTSYBaiduTool #pragmamark - BMKPoiSearchDelegate //实现PoiSearchDeleage处理回调结果 -onGetPoiResult:(BMKPoiSearch*)searcherresult:(BMKPoiResult*)poiResultListerrorCode:(BMKSearchErrorCode)error{ if(error ==BMK_SEARCH_NO_ERROR) { //在此处理正常结果 self.block(poiResultList.poiInfoList); } else if(error ==BMK_SEARCH_AMBIGUOUS_KEYWORD){ //当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表 //result.cityList; NSLog(@"起始点有歧义"); }else{ NSLog(@"抱歉,未找到结果--%zd", error);} } @end

那么为什么需要把block当作参数去使用呢?

3.在A控制器.m文件中

如下方法中书写:

– (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

BViewControl *VC = segue.destinationViewController;

VC.returnBlock = ^(NString* string){

self.textLabel.text = string;

}];

}

可以看到代码中的注释,系统告诉我们可以用[segue
destinationViewController]来获得B视图控制器。

#import”Singleton.h”

 #import typedef void (NSArray*result); @interfaceTSYBaiduTool :NSObject single_interface(TSYBaiduTool) -getPoiWithCeneter:(CLLocationCoordinate2D)centerkey:(NSString*)key Result:block; -addAnnotationCenter:(CLLocationCoordinate2D)centertitle:(NSString*)title subTitle:(NSString*)subTile toMapView:(BMKMapView*)mapView; @end

这就引出了block这个时候的使用场景:当自己封装一个类的时候,有些事情由外部决定,但什么时候做由内部决定,(即内部决定执行时间,外部传入具体做些什么)——这个时候就可以使用block来作为参数

4.BLock访问局部变量

{

int A = 8;

int (^Block)(int) = ^(int a){ return A + a;};
//block里面可以读取同一类型的outA的值

A = 5;  //在调用Ptr之前改变A的值

int result = Block(3);  // result的值仍然是11,并不是8

NSLog(@”result=%d”, result);

为什么result
的值仍然是11?而不是8呢?事实上,myPtr在其主体中用到的outA这个变量值的时候做了一个copy的动作,把outA的值copy下来。所以,之后outA即使换成了新的值,对于myPtr里面copy的值是没有影响的。

需要注意的是,这里copy的值是变量的值,如果它是一个记忆体的位置(地址),换句话说,就是这个变量是个指针的话,

#import”ViewController.h”

 #import"TSYBaiduTool.h" @interfaceViewController() @property(weak,nonatomic) IBOutlet BMKMapView*mapView; @end @implementationViewController - viewDidLoad { [super viewDidLoad]; self.mapView.delegate=self; } #pragmark - BMKMapViewDelegate /***长按地图时调用* @param mapView 地图* @param coordinate点对应的经纬度*/ -mapview:(BMKMapView*)mapView onLongClick:(CLLocationCoordinate2D)coordinate{//调整地图显示区域 BMKCoordinateSpanspan = BMKCoordinateSpanMake(0.075418,0.051922); BMKCoordinateRegionregion = BMKCoordinateRegionMake(coordinate, span); [mapViewsetRegion:regionanimated:YES]; //poi检索 [[TSYBaiduToolsharedTSYBaiduTool]getPoiWithCeneter:coordinatekey:@"小吃"Result:^(NSArray *result) { [resultenumerateObjectsUsingBlock:^(BMKPoiInfo*_Nonnullobj,NSUIntegeridx,BOOL*_Nonnullstop) {//添加大头针 [[TSYBaiduToolsharedTSYBaiduTool]addAnnotationCenter:obj.pttitle:obj.namesubTitle:obj.addresstoMapView:self.mapView];}];}];}@end

2.block当作返回值来使用

注意:

如下代码,test为方法名,void(^)()这就是block的类型,这样就可以这样使用4166am金沙下载 3,其中的的self.test是相当于属性的get方法,后面再加一个()就相当于执行block.

1.在某个变量前面如果加上修饰字“__block”的话(注意,block前面有两个下划线),这个变量就称作block variable

4166am金沙下载 4

2.直接存取static类型的变量

同时时还可以将这个block给相同类型的bock赋值.如下代码所示.

3.那么在block里面就可以任意修改此变量的值

4166am金沙下载 5

3.把Block 当成参数传递给一个函数

//function的定义,将Block作为参数

-void myFunction:(int (^mySquare)(int))myFunction;   

//定义一个myBlock的Block 变量

int (^myBlock)(int) = ^(int a){

return a*a;

}; 

myFunction(myBlock);    //把mySquare作为myFunction的参数

所以myBlock后加一个小括号就是执行,这样就能理解为什么上面self.test加一个小括号就是执行.——这让我联想到swift里执行函数都是点点点,并且加上()就是创建对象执行函数等等,原来都是这么的类似….

block当返回值使用思想:链式编程,把方法调用通过语法链接起来,可读性非常好

下面简单来演示一下用Block来进行链式编程

创建一个类继承NSObject命名为AddTool,即到时我们要用它来进行链式累加,它的.h文件里如下

4166am金沙下载 6

它的.m文件如下:

4166am金沙下载 7

然后在ViewController类里进行调用如下

4166am金沙下载 8

运行起来,打印结果为4166am金沙下载 9,OK完成!

 

二.Block逆传值的使用

   
 Block可以用于控制器界面间逆向传值.使用方法是这样:控制器B传值给控制器A,
那么要在控制器B中的头文件.h声明一个Block属性,
并且在控制器B的.m文件中执行这个Block.

代码表示如下:

@property (nonatomic,strong) void(^myBlock)(NSString *);

     说明:这里定义了一个无返回值,参数为NSString
*的Block,Block的名字为myBlock,这就类比声明一个函数void
test(int);——无返回值,参数为int,函数名为test.

     如果是创建一个int返回值的block将上面的void改为int

     且这里的Block类型为strong类型,关于Block的修辞策略后面再讲.

    if (_myBlock) {

        _myBlock(@”1234567″);

        NSLog(@”%@”, str);

    }

     说明:这里的if是对Block先进行判断,作用是判断Block是否已经分配好内存,如果定义完成就执行,并传入了一个字符串参数

   
 如果block有返回值,那么可以用一个值来接收它的返回值如int num =
_myBlock(@“1234567”);

先importB的头文件,再创建一个B的具体对象如下为myVC,然后

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图