树下的老男孩

工匠之行,在行动中体悟修行的乐趣


  • 首页

  • 技术

  • 其它

  • 归档

关于GCD开发的一些事儿

发表于 2015-11-20   |   分类于 tech   |     |   阅读次数

在之前我们介绍过NSOperation的一些东西,这次我们来聊一聊另一个iOS开发最经常使用的技术之一 — GCD,GCD将线程的管理移到系统级别,你只需要定义好要执行的任务,然后丢到合适的Dispatch queue,GCD会负责创建线程来执行你的代码,由于这部分是处于系统级别,所以执行的性能通常非常高。GCD这部分代码苹果已开源,有兴趣的可以去下载了解一下:地址
在介绍GCD之前我们先了解一下Quality of Service:

Quality of Service(QoS)

这是在iOS8之后提供的新功能,苹果提供了几个Quality of Service枚举来使用:user interactive, user initiated, utility 和 background,通过这告诉系统我们在进行什么样的工作,然后系统会通过合理的资源控制来最高效的执行任务代码,其中主要涉及到CPU调度的优先级、IO优先级、任务运行在哪个线程以及运行的顺序等等,我们通过一个抽象的Quality of Service参数来表明任务的意图以及类别。

  • NSQualityOfServiceUserInteractive
    与用户交互的任务,这些任务通常跟UI级别的刷新相关,比如动画,这些任务需要在一瞬间完成
  • NSQualityOfServiceUserInitiated
    由用户发起的并且需要立即得到结果的任务,比如滑动scroll view时去加载数据用于后续cell的显示,这些任务通常跟后续的用户交互相关,在几秒或者更短的时间内完成
  • NSQualityOfServiceUtility
    一些可能需要花点时间的任务,这些任务不需要马上返回结果,比如下载的任务,这些任务可能花费几秒或者几分钟的时间
  • NSQualityOfServiceBackground
    这些任务对用户不可见,比如后台进行备份的操作,这些任务可能需要较长的时间,几分钟甚至几个小时
  • NSQualityOfServiceDefault
    优先级介于user-initiated 和 utility,当没有 QoS信息时默认使用,开发者不应该使用这个值来设置自己的任务
阅读全文 »

NSOperation和NSOperationQueue的一些事儿

发表于 2015-11-02   |   分类于 tech   |     |   阅读次数

在面对多线程的时候,大多数会选择NSOperation或者GCD来实现,GCD由于使用起来非常方便,应该是很多开发者的首选,不过你会发现其实很多开源代码都是使用NSOpertaion来执行异步任务,所以这次我们来说说NSOperation跟NSOperationQueue,以及它的强大之处。

NSOPerationQueue

NSOperation可以通过调用start方法同步地执行相应的任务,不过通常NSOprtaion都是配合NSOPerationQueue来使用的,NSOperationQueue可以看作是一种高级的dispatch queue,将NSOperation加入到queue中,queue会自动异步的执行该NSOperation

1
2
3
4
5
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//将NSOperation加入队列之后,queue会自动执行该operation
[queue addOperation:operation];

在gcd编程的时候,我们无法取消block对应的任务,不过NSOPerationQueue之所以称为高级的dispatch queue除了能异步的执行任务之外,还能够:

  • 取消操作
    当NSOperation加入到NSOperationQueue之后,可以通过调用cancel方法取消单个任务,如果想取消所有的任务可以调用cancelAllOperations方法;
1
2
3
4
5
// 取消一个任务 
[operation cancel];

// 取消queue中所有的任务
[queue cancelAllOperations];
阅读全文 »

IM开发(2)-XMPP iOS开发

发表于 2015-10-20   |   分类于 tech   |     |   阅读次数

搭建完本地服务器之后,我们便可以着手客户端的工作,这里我们使用XMPPFramework这个开源库,安卓平台可以使用Smack(最好使用4.1以及之后的版本,支持流管理),为了简单起见这里只实现登陆、获取好友列表以及聊天等功能,页面如下所示:

阅读全文 »

IM开发(1)-ejabberd服务器搭建

发表于 2015-10-08   |   分类于 tech   |     |   阅读次数

最近项目中需要集成IM功能,市面上有很多的第三方提供im服务,比如环信、融云等,但都有使用限制的地方,如果不使用第三方可以自己去实现一套IM系统,不过一个IM系统涉及到的东西比较多,开发难度较高。另一种选择是使用xmpp,xmpp的优点是有很多的开源实现,比如服务端的ejabberd、Openfire,iOS以及安卓端都很优秀的开源库可以使用,而且传输安全以及扩展性强等(环信也是基于xmpp);同时也有一些缺点,比如不能传输二进制数据以及费流量等,有些地方需要去改进。
下面记录如何使用XMPP来简单实现IM功能,在这之前需要先搭建本地服务器用于测试。

阅读全文 »

iOS app性能优化的那些事(二)

发表于 2015-09-09   |   分类于 tech   |     |   阅读次数

  这次我们来说说iOS app中滑动的那些事。iOS为了提高滑动的流畅感,特意在滑动的时候将runloop模式切换到UITrackingRunLoopMode,在这个过程中专心做跟滑动相关的工作,这也就是在滑动过程中为什么nstimer无法工作的原因,因为两个没在同一mode下面。但我们可能经常会遇到滑动不怎么流畅的情况,比如在项目中碰到在滑动tableview的时候不怎么顺畅,感觉有点不爽,即便是在测试中表现最好的5s(touch之类的感受更直观)。


tableview 滑动不流畅
阅读全文 »

iOS app性能优化的那些事

发表于 2015-09-05   |   分类于 tech   |     |   阅读次数

  iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对复杂一些,导致应用在比如touch等较低端的产品上,光从启动到进入页面就花了将近一分钟的时间,页面之间的切换没有那种很流畅的感觉,内存也居高不下,比较影响应用的用户体验,所以很有必要进行一些优化,下面记录一下我在优化的过程中的一些心得:

1 instruments

  在iOS上进行性能分析的时候,首先考虑借助instruments这个利器分析出问题出在哪,不要凭空想象,不然你可能把精力花在了1%的问题上,最后发现其实啥都没优化,比如要查看程序哪些部分最耗时,可以使用Time Profiler,要查看内存是否泄漏了,可以使用Leaks等。关于instruments网上有很多资料,作为一个合格iOS开发者,熟悉这个工具还是很有必要的。

阅读全文 »

ogre3D在Mac平台的编译

发表于 2015-08-26   |   分类于 others   |     |   阅读次数

  本文主要介绍如何在Mac平台下编译一份可以在iOS上运行的ogre3d引擎的sdk,OGRE简单来说就是一个图形引擎,并且也只是一个图形引擎,不像cocos2dx之类的游戏引擎,包括网络,声音和物理碰撞等组件,OGRE只专注于图形渲染这块,不过可以方便的结合其它组件来组成一个游戏引擎,具体可以自己去了解。


编译OGRE3d

首先创建一个文件夹用于放置OGRE3D项目,这个可以随便指定,比如放置在桌面:

1
mkdir /Users/LJ/Desktop/OGREBuild

  • 下载Ogre3d依赖
    编译ogre需要首先下载相关的依赖库,由于我们想要编译的是运行在iOS上面的,所以选择现在iOS相关的依赖库,下载地址:iOSDependencies,打开dmg将里面的文件夹拖到OGREBuild文件夹里面;
  • 下载ogre3d源码
    这里我使用的是1.9版本的代码,可以使用下面的命令克隆对应的源码(要先安装Mercurial):
    1
    hg clone https://bitbucket.org/sinbad/ogre ogre3d

最后面是指定下载的文件夹名字,文件大小500M左右,下载过程比较缓慢,可以到网盘里面下载:ogre3d,同样把该文件夹放到OGREBuild里面;

  • CMake安装
    首先要先安装cmake,安装方法可以参考网上的信息,打开控制台,在ogre3d里面创建一个build文件夹,然后运行cmake命令:
阅读全文 »

method Swizzling实践--alloc hooker

发表于 2015-08-06   |   分类于 tech   |     |   阅读次数

  废话不多说,直接进入正题。这次碰到的问题主要是在项目里涉及到的一些内存问题,先说说这个项目的整体结构,由于要实现跨平台的缘故,所以在最顶层是由lua来编写相关的业务代码的,实现安卓和iOS端业务的快速开发,中间是一层统一的c++接口,然后iOS跟安卓根据这份统一的c++接口实现各自平台的底层逻辑代码,比如对于一个View,c++的统一接口为:

1
void *createView(const char *type)

然后创建view由iOS跟安卓各自去实现,iOS端可以实现c++跟oc的混合编码,可以直接调用oc的代码,然后lua调用c++借由swig实现互调,这个有很多种方法可以自己去挑选合适的。
  下面说说框架中遇到的问题,由于这中间涉及到lua,c++跟oc的混合编码,而且oc使用的是mrc方式(项目开始的时间比较早),因此内存管理的问题变得尤为重要。正常的处理逻辑是:创建时,lua调用c++去new一个oc对象;释放时,lua调用c++的析构函数,然后在析构函数里完成oc对象的释放。然后怎么确保这些对象按照这个逻辑被释放掉了呢~

阅读全文 »
1234
树下的老男孩

树下的老男孩

28 日志
2 分类
15 标签
© 2015 - 2016 树下的老男孩 | 本站总访问量次
由 Hexo 强力驱动
主题 - NexT.Pisces