`

如何在iOS中使用Block

    博客分类:
  • IOS
 
阅读更多
Block可以帮助我们组织独立的代码段,并提高复用性和可读性。iOS4在UIKit中引入了该特征。超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识。

Block是什么样的?
你可以使用^操作符来声明一个Block变量,它表示一个Block的开始。
int num1 = 7;  
int(^aBlock)(int) = ^)int num2) {  
   return num1+nunm2;  
};
 
在如上代码中我们将Block声明为一个变量,所以可以将它当做一个函数中使用:
NSLog(@"%d", aBlock(49)); //adds 49 to 7 which gives us 56.  
我们刚看过了将block当做变量的情况,但通常情况下我们会以内联的方式使用Block,比如在一个变量中。API要么会使用Block在一个对象集合上执行某种操作,要么将其作为一个操作完成后的回调。
NSComperator compareStringsBlock = ^(id stringA, id stringB) {  
NSRange rangeS  = NSMakeRange (0, [stringA length]);  
  return (stringA compare:stringB options:comparisonOptions range:rangeS locale:currentLocale];  
};  
NSArray *compareSortArray  = [arrayOfStringDays sortArrayUsingComparator: compareStringsBlock]);  


Block具有将临时函数体创建为表达式的优势。Apple文档中指出:
Block是符合如下要求的匿名内联的代码集:
• 和函数一样具有一个指定类型的参数列表
• 有一个可以推导或声明的返回值类型
• 可以从它被定义的词义范围中捕捉状态
• 可以在需要的时候改变词义范围的状态
• 可以和相同的词义范围中定义的其他的Block共享更改的可能。
• 可以在词义范围(堆栈帧)被销毁后继续共享和修改该词义范围(堆栈帧)的状态。
Block是一个自包含的小代码段,封装了用于遍历(线性遍历)或者回调,可以并发执行的任务单元。

声明和使用Block
Apple文档中介绍了如何将一个Block声明为变量,并将其作为一个函数使用:

int (^oneFrom)(int) = ^(int anInt) {  
    return anInt - 1;  
};  
// 我们创建了一个内联块^(int anInt)... ,其函数体和结果被传到了另外一个名为OneFrom的Block。  
 
printf("1 from 10 is %d", oneFrom(10));  
// 打印出: "1 from 10 is 9"  
// 这个block函数(distanceTraveled)传入3个float型参数,返回float值。   
 
float (^distanceTraveled) (float, float, float) =  
 
                          ^(float startingSpeed, float acceleration, float time) {  
    float distance = (startingSpeed * time) + (0.5 * acceleration * time * time);  
    return distance;  
}; 

  你也可以传入一个Block作为一个参数,而不要以如上的方式声明它们,这样就可以在需要将block作为参数的时候以内联代码的方式简单地实现。
NSArray *anArray = [NSArray arrayWithObjects: @"cat", @"dog",nil];  
sortFunction(anArray, ^(string *a string *b){  
if ( a == @"cat") return TRUE; }); 

这样我们就看到一个内联的block代码段占据了最后一个参数(必须是参数列表的最后一个参数)的位置。Cocoa提供了很多使用Block的方法,这样你就可以传入Block作为方法的参数:
NSArray *array = [NSArray arrayWithObjects: @"A", @"B", @"C",  nil];  
NSSet *filterSet = [NSSet setWithObjects: @"A", @"Z", @"Q", nil];  
 
BOOL (^test)(id obj, NSUInteger idx, BOOL *stop); //Block declaration returns BOOL, params inc. id and BOOL  
//body of block gets the block literal ^(id obj, NSUInteger idx, Bool *stop)... and the body logic   
test = ^ (id obj, NSUInteger idx, BOOL *stop) {  
    if (idx < 5) {  
        if ([filterSet containsObject: obj]) {  
            return YES;  
        }  
    }  
    return NO;  
 
}; 

Apple提供的另外一个例子是:

__block BOOL found = NO;  
NSSet *aSet = [NSSet setWithObjects: @"Alpha", @"Beta", @"Gamma", @"X", nil];  
NSString *string = @"gamma";  
//we provide below a way of how to enumerate, using our own compare logic  
[aSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {  
    if ([obj localizedCaseInsensitiveCompare:string] == NSOrderedSame) {  
        *stop = YES;  
        found = YES;  
    }  
}]; 


掌握它需要一点时间,但一旦领会了还是很简答的,是不?我建议大家看下Apple的文档,并看看其中引用到的一些API以确认下它们是如何使用的。多练习,熟能生巧!

分享到:
评论

相关推荐

    IOS Block的使用

    接下来,我们将详细讨论如何在iOS中使用Block,包括作为局部变量、属性以及函数参数的用法。 1. **Block作为局部变量** 在函数或方法内部,我们可以声明并定义一个Block,将其作为局部变量。Block的定义通常以`^`...

    iOS block基础使用

    本文将深入探讨如何在iOS中使用Block。 ### 一、Block定义 Block 是一种匿名函数,可以在代码中定义,无需预先声明。Block 的基本语法如下: ```objc ^return_type (parameter_list) { // Block 体 } ``` 例如...

    iOS block使用总结

    在iOS开发中,Block是一种强大的、灵活的代码封装机制,它允许我们定义并存储一段可执行的代码,可以在需要的时候调用。Blocks是Objective-C的语法扩展,后来也被引入到Swift中,对于处理异步操作、事件回调、简化...

    iOS Block使用教程

    - 避免在Block中大量编写复杂逻辑,保持Block简洁。 - 使用清晰的Block参数和返回值类型,提高代码可读性。 - 使用`@autoreleasepool`在Block内部管理临时对象的内存。 通过以上内容的学习,你将对iOS中的Block...

    ios-把block当成属性放在全局字典中的用例.zip

    因此,使用时应谨慎处理Block中的强引用循环,确保及时释放不再使用的资源。 总的来说,这个示例提供了一种在iOS应用中方便地跨界面传递和执行Block的方法,减少了对代理模式的依赖,提高了代码的灵活性。然而,...

    ios 视图间Block传值

    Block是苹果在Cocoa Touch框架中引入的一种强大的闭包特性,它可以捕获和存储其定义范围内的局部变量,并可以在其他地方使用。Block可以作为函数参数,也可以返回Block。在iOS开发中,Block被广泛用于处理异步操作,...

    iOS中Block的回调使用和解析详解

    本篇文章将深入讲解如何在iOS中使用Block进行回调,并通过一个具体的例子来阐述其工作原理和常见问题。 在iOS开发中,我们经常会遇到这样一个场景:从一个界面(如AViewController)跳转到另一个界面(如...

    ios-block 回调.zip

    "ios-block 回调.zip"中的"CallbackDemo"很可能是展示了一个关于如何在iOS应用中使用Block进行回调的实例。 Block的基本结构由`^`符号开启,后面跟着返回类型(如果有的话),接着是参数列表,最后用`{}`包裹实现的...

    iOS Block 的使用, 包括传值, 基本用法

    在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义可嵌套的匿名函数。Block不仅可以简化复杂的代码结构,还可以实现回调机制,使得异步操作变得简单易懂。本篇文章将深入探讨iOS Block的基本用法以及...

    iOS Block 界面传值

    2. Block调用:调用Block就像调用一个方法一样,把参数传递进去即可执行Block中的代码。 三、Block在界面传值中的应用 1. 通过Block在控制器间传递数据:假设我们有两个控制器,AController和BController,A...

    ios中block的应用

    该文档简单的介绍了ios下block是的使用方法和一些小技巧

    iOS的block回调

    这样,我们可以在Block中处理这些结果,无需编写复杂的回调函数。 Block回调的一个重要特性是它可以捕获和使用其定义时的作用域内的变量,这被称为“封闭”(closing over)。但需要注意的是,如果Block引用了循环...

    IOS block回调代码实例Demo

    总之,"IOS block回调代码实例Demo"是一个很好的学习资源,它展示了如何在iOS应用中使用Block进行回调,这对于理解和掌握iOS开发中的异步编程至关重要。通过深入研究这个Demo,开发者可以更好地运用Block来优化代码...

    ios-block 多参数传值.zip

    但是栈上的Block不能被其他线程访问,也不能在异步操作中使用。 2. **堆存储(Heap Block)**:如果Block引用了外部对象,编译器会将其存储在堆上,并且需要手动管理内存(使用`copy`属性或者`__strong`关键字)。...

    block反向传值

    我们将讨论block的基本概念、如何在iOS中使用block以及在实际项目中实现block反向传值的步骤。 首先,理解什么是block。Block是苹果在Objective-C和Cocoa Touch框架中引入的一种强大的特性,它允许我们在代码中定义...

    block在ios中的具体用法与解析

    Block是iOS开发中的一种强大的编程概念,它允许程序员在代码中定义可重用的代码块,这些代码块可以像函数一样被传递和调用。在iOS应用开发中,Block经常用于处理异步操作、事件回调、排序和过滤数据等场景。下面我们...

    ios-block反向传值.zip

    例如,在网络请求中,我们可能在回调Block中处理接收到的数据: ```objc [AFNetworking GET:@"https://example.com/data" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable response...

    ios-跨页面传值 block传值.zip

    在这里,我们将详细探讨Block在iOS开发中的应用以及如何用它来实现跨页面的数据共享。 首先,理解Block是什么至关重要。Block是Objective-C(以及后来的Swift)中的一个特性,它允许我们在代码中定义匿名函数,即...

    ios-block作为对象属性和返回值的展示方式.zip

    在iOS开发中,Block是一种强大的编程工具,它允许我们在代码中定义可执行的代码块,类似于函数,但可以在运行时动态地使用。本教程将深入探讨如何将Block用作对象属性以及作为返回值来增强代码的灵活性和可读性。 ...

    ios Block和代理的对比

    在iOS开发中,Block和代理是两种常用的回调机制,它们都可以用来实现对象间的通信,但具体用法和特性有所差异。下面将详细讲解Block和代理的对比,以及它们各自的应用场景。 首先,Block是一种内联函数,它可以捕获...

Global site tag (gtag.js) - Google Analytics