如何在iOS中使用Block──How to use Blocks with iOS

如何在iOS中使用Block──How to use Blocks with iOS,第1张

概述  Block可以帮助我们组织独立的代码段,并提高复用性和可读性。iOS4在UIKit中引入了该特征。超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识。 Block是什么样的?  你可以使用^ *** 作符来声明一个Block变量,它表示一个Block的开始。 int num1 = 7;   int(^aBlock)(int)

 

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, Bool *stop)... and the body logic         test = ^ (ID obj, 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;            }        }];     

As you can see,it takes a little while to have it sink in but once you get it,it's quite simple. I suggest looking at Apple's documentation,as well as looking at the referenced APIs to see how they are used. Practice makes perfect. 

 

原文出处:http://answers.oreilly.com/topic/2281-how-to-use-blocks-with-ios/

总结

以上是内存溢出为你收集整理的如何在iOS中使用Block──How to use Blocks with iOS全部内容,希望文章能够帮你解决如何在iOS中使用Block──How to use Blocks with iOS所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1067072.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存