NSOperationQueue     *operationQueue; // for rendering pages on second thread

[operationQueue waitUntilAllOperationsAreFinished];

一句很简单的代码,可以实现UI的异步操作,知道操作完成,才进行进一步刷新。

NSOperationQueue是一个Operation执行队列,你可以将任何你想要执行的Operation添加到Operation Queue中,以在队列中执行。同时Operation和Operation Queue提供了很多可配置选项。Operation Queue的实现中,创建了一个或多个可管理的线程,为队列中的Operation提供可高度自定的执行环境。

DemoCode如下:

// Don't change font feature settings until all secondary thread operations are done

[operationQueue waitUntilAllOperationsAreFinished];

// Set up our font feature bitfield for given optionName

ASDFeaturesBits optionBitSelected = 0;

if (([optionName rangeOfString:ASD_SMALL_CAPITALS]).length > 0 ) {

optionBitSelected = ASDFeaturesSmallCaps;

}

else if (([optionName rangeOfString:ASD_RARE_LIGATURES]).length > 0 ) {

optionBitSelected = ASDFeaturesLigatures;

}

else if (([optionName rangeOfString:ASD_PROP_NUMBERS]).length > 0 ) {

optionBitSelected = ASDFeaturesPropNumbers;

}

else if (([optionName rangeOfString:ASD_STYLISTIC_VARS]).length > 0 ) {

optionBitSelected = ASDFeaturesStylisticVariants;

}

if (optionBitSelected && ((optionBitSelected & ASDFeaturesFeatureMask) != 0)) {

// Font features are most of the time exclusive so for simplicity we allow one feature at a time

viewOptions &= ~ASDFeaturesFeatureMask;

viewOptions |= optionBitSelected;

}

else {

// Passing @"" as the option is used to turn off all options

if ([optionName length] == 0) {

viewOptions = 0;

} else {

viewOptions ^= optionBitSelected;

}

}

if (pageViews[currCoreTextView].selectedFrame == NSUIntegerMax) {

// No selected frame, apply font features to all doc text

NSRange range = NSMakeRange(0, [document.attributedString length]);

[document setFontFeatures:(viewOptions & CoreTextViewOptionsFeatureMask) range:range];

[self relayoutDocFromPage:pageDisplayed];

}

else {

// Apply font features to selected frame

// (note that this only applies for "text" type frames)

CoreTextViewPageInfo* page = [pagesInfo objectForKey:[NSNumber numberWithInt:pageDisplayed]];

CoreTextViewFrameInfo* frame = [page.framesToDraw objectAtIndex:pageViews[currCoreTextView].selectedFrame];

if (frame.frameType == ASDFrameTypeTextFlow) {

[document setFontFeatures:(viewOptions & CoreTextViewOptionsFeatureMask) range:frame.stringRange];

[self relayoutDocFromPage:pageDisplayed];

}

else if (frame.frameType == ASDFrameTypeText) {

ApplyFontFeaturesToString(frame.value, frame.stringRange, (viewOptions & CoreTextViewOptionsFeatureMask));

[frame refreshTextFrame];

[self refreshPage];

}

}

IOS之UI异步刷新的更多相关文章

  1. iOS之UI组件整理

    作者:神兽gcc 授权本站转载. 最近把iOS里的UI组件重新整理了一遍,简单来看一下常用的组件以及它们的实现.其实现在这些组件都可以通过Storyboard很快的生成,只是要向这些组件能够变得生动起 ...

  2. iOS开发UI篇—CAlayer(自定义layer)

    iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的Draw ...

  3. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  4. iOS开发-UI 从入门到精通(三)

    iOS开发-UI 从入门到精通(三)是对 iOS开发-UI 从入门到精通(一)知识点的综合练习,搭建一个简单地登陆界面,增强实战经验,为以后做开发打下坚实的基础! ※在这里我们还要强调一下,开发环境和 ...

  5. iOS开发-UI 从入门到精通(二)

    iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI ...

  6. iOS开发UI篇—懒加载

    iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...

  7. iOS开发UI篇—CAlayer层的属性

    iOS开发UI篇—CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...

  8. iOS开发UI篇—CAlayer(创建图层)

    iOS开发UI篇—CAlayer(创建图层) 一.添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控 ...

  9. iOS开发UI篇—CALayer简介

    iOS开发UI篇—CALayer简介   一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实 ...

随机推荐

  1. android 自动生成jni C语言头文件

    1. 在类里面申明 public native xxx(); 函数接口2. 在安卓工程src目录下 使用命令 javah 包名.类名 生成该类所申明的c语言接口

  2. Lecture 0 --基本说明

    Abstract:本章所记录的知识是后面章节需要的前导知识,请务必仔细读本章,理解涉及的知识点,方便后面章节的学习.本次数据结构笔记主要参考殷人昆的<数据结构(C语言描述)>这本书,需要的 ...

  3. nohup不输出日志信息的方法及linux重定向

    最近使用nohup创建了一个后台进程,默认日志输出到了nohup.out文件中,程序跑起来也就没再管,过了大约一周,发现硬盘空间不够了,于是查找原因,发现这个nohup.out文件已经到了70G了,导 ...

  4. java的Set, List, Map简单介绍

    Set, List, Map Set和List,Map都是集合,Set和List都是继承于Collection接口,而Map不是. 1.Map(映射) :Map是以key,Value的形式存储数据的映 ...

  5. C# 生成随机阿拉伯数字,或字符串

    //TextBox1.Text = TongYong.SuiJi.SuiJiMingZi(2); public class SuiJi { //TextBox1.Text = TongYong.Sui ...

  6. Dapper的正确使用姿势

    本文demo适用于MySQL Dapper优势和缺点 优点 高性能.易排查.易运维.灵活可控 缺点 和EF相比,手写sql当修改表结构不易发现bug. 习惯了EF后再来使用Dapper,会很难适应那种 ...

  7. 使用Bootstrap实现表格列的显示与隐藏

    来人,上效果图 走官方通道 1.引入样式文件(去github下载样式文件) <!--插件开--> <link rel="stylesheet" href=&quo ...

  8. KM算法萌新讲解篇

    KM算法   首先了解问题:也就是最大权值匹配: 二分图里,边带了权值,求整幅图里匹配最大/最小的权值 因为接触匈牙利算法的时候看的是找对象系列的博文,所以也自己写一发找对象的博文吧: 算法背景: 信 ...

  9. P5135 painting(组合数)

    传送门 如果\(op==1\),那么每一个方案都可以看做从\(n\)个数里选出\(m\)个数,然后\(sort\)一下依次放到每列,方案数就是\({n\choose m}\).因为\(n\)很大,但是 ...

  10. Nginx 405 not allowed最简单快速解决办法

    Apache.IIS.Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误. server { list ...