iOSblock基本使用方法 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

iOSblock基本使用方法

发表时间:2021-1-4

发布人:葵宇科技

浏览次数:44


我们可以把Block当作一个闭包函数,它可以访问外部变量和局部变量,但默认是不可以修改外部变量。
你可以使用它来做回调方法,比起使用代理(Delegate)会更加直观。
一、Block的基本定义
Block的基本写法(也是详细写法):
returnType (^blockName)(params) = ^returnType(params) {
    // code... 
};

返回类型 (^Block的名字)(Block的参数) = ^返回类型(Block的参数) { 这里放代码 },例:
int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){
    return 100;
};

 
如果你的Block不需要返回类型和参数,那么你可以简写为:
void (^myBlock2)() = ^(){
    
};


void (^myBlock2)(void) = ^void(void){
    
};

返回类型或参数,没有的话可以用“void”代替。
 
你也可以把等于号右边,^后的()删除,即是:
void (^myBlock2)() = ^{
    
};

 
你也可以先定义一个Block函数,但不写函数的实现,我们可以在后面再写具体函数的实现,像这样:
void (^myBlock2)(void);
myBlock2 = ^{
    
};

 
 
二、Block作为方法定义
把Block定义在方法里,与上面不同的是,Block的名字不需要在声明时写上,而是在后面,像这样:
[img]http://common.cnblogs.com/images/copycode.gif
- (void)getWtihBlock:(void (^)())block
{
    // code...
    
    // 记得要调用block
    block();
}

[img]http://common.cnblogs.com/images/copycode.gif
 
使用方法:
[self getWtihBlock:^{
    NSLog(@"sdf");
}];

 
下面作了一个详细点的例子,并写了备注:
[img]http://common.cnblogs.com/images/copycode.gif
/**
 *  追加自身字符串N次(每次复制前加一个换行\n)
 *
 *  @param string      字符串
 *  @param count       追加次数
 *  @param stringBlock 目标Block,其中str参数为结果字符串
 */
 // Block也可以定义在方法里,但是不需要定义Block的名字
 // IOS开发很多的API也用到了Block,像UIView的块动画
- (void)getStrWithString:(NSString *)string
               CopyCount:(int)count
            resultString:(void (^)(NSString *str))stringBlock
{
    NSMutableString *newString = [NSMutableString stringWithString:string];
    for (NSUInteger i = 0; i < count; i++) {
        NSUInteger len = [string length];
        NSString *insertString = [NSString stringWithFormat:@"\n%@", string];
        [newString insertString:insertString atIndex:len];
    }
    // 调用block,传入字符串newString
    stringBlock(newString);
}

[img]http://common.cnblogs.com/images/copycode.gif
 
用法也是一样:
[img]http://common.cnblogs.com/images/copycode.gif
BlockObject *block = [[BlockObject alloc] init];
[block getStrWithString:@"Garvey"
              CopyCount:3
           resultString:^(NSString *str) {
               // str为处理后的结果
               NSLog(@"str is %@", str);
           }];

[img]http://common.cnblogs.com/images/copycode.gif
 
有时候复杂的Block语法会令到函数的声明难以阅读,所以会经常使用typedef对Block起一个新类型。
typedef void (^ResultBlock)(NSString *str);

 
定义方法时就变成了:
- (void)getStrWithString2:(NSString *)string
                CopyCount:(int)count
             resultString:(ResultBlock)stringBlock;

 
让我们对比一下,使用typedef前后:
[img]http://common.cnblogs.com/images/copycode.gif
// 使用前
- (void)getStrWithString:(NSString *)string
               CopyCount:(int)count
            resultString:(void (^)(NSString *str))stringBlock;

// 使用后
- (void)getStrWithString2:(NSString *)string
                CopyCount:(int)count
             resultString:(ResultBlock)stringBlock;

[img]http://common.cnblogs.com/images/copycode.gif
注意:使用方法是一样的,只不过定义变得简单了。

相关案例查看更多