在执行I/O操作中,大多数情况下都会祖塞主线程,这些操作需要从读写外部资源,例如磁盘或者网络。

  关于网络操作可以使用NSURLConnection的如下方法,以异步的方式来执行:

  + (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

  或者使用第三方框架,例如AFNetworking。

  如果你需要做一些其它类型开销很大的操作(例如执行一个时间密集型的计算或者对磁盘进行读写),那么使用GCD(Grand Central Dispatch),或NSOperations 和 NSOperationQueues。

  下面的代码是使用GCD的一个模板:

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // switch to a background thread and perform your expensive operation dispatch_async(dispatch_get_main_queue(), ^{ // switch back to the main thread to update your UI });});

  如上代码,为什么在第一个dispatch_async里面还嵌套了一个dispatch_async呢?这是因为关于UIKit相关的代码需要在主线程里面执行。

  对NSOperation和GCD感到好奇吗?可以看看Ray Wenderlich中的教程:iOS中多线程和GCD—初级,以及Soheil Azarpour的如何使用NSOperations和NSOperationQueues教程。

  6) 让图片的大小跟UIImageView一样

  确保图片和UIImageView大小一致

  如果需要将程序bundle中的图片显示到UIImageView中,请确保图片和UIImageView的大小是一样的。因为图片的缩放非常耗费资源,特别是将UIImageView嵌入到UIScrollView中。

  如果是从远程服务中下载图片,有时候你控制不了图片的尺寸,或者在下载之前无法在服务器上进行图片的缩放。这种情况,当图片下载完之后,你可以手动进行图片的缩放——做好是在后台线程中!——然后再在UIImageView中使用缩放过的图片。

  7) 选择正确的集合

  选择正确的集合

  学习使用适合的类或对象是编写高效代码的基础。特别是在处理集合数据时,尤为重要。

  苹果的官网上有一篇文章:集合编程主题(Collections Programming Topics)——详细的介绍了在集合数据中可以使用的类,以及什么情况下使用哪个类。在使用集合时,每个开发者都应该阅读一下这个文档。

  太长,不想阅读(TLDR)?下面是常见集合类型的一个简介:

  数组:是一个值按顺序排列的一个列表。根据索引可以快速查找,不过根据值进行查找比较慢,另外插入和删除也比较慢。

  字典: 存储键/值对。根据键可以快速查找。

  Sets: 是一个值无序排列的列表,根据值可以快速查找,另外插入和删除也比较快。

  8) 使用GZIP压缩

  使用GZIP压缩

  越来越多的程序依赖于外部数据,这些数据一般来自远程服务器或者其它的外部APIs。有时候你需要开发一个程序来下载一些数据,这些数据可以是XML,JSON,HTML或者其它一些文本格式。

  问题是在移动设备上的网络是不确定的。用户的设备可能在EDGE网络一分钟,然后接着又在3G网络中。不管在什么情况下,都不要让用户等待。

  有一个可以优化的选择:使用GZIP对网络传输中的数据进行压缩,这样可以减小文件的大小,并加快下载的速度。压缩对于文本数据特别有用,因为文本具有很高的压缩比。

  iOS中,如果使用NSURLConnection,那么默认情况下已经支持GZIP压缩了,并且基于NSURLConnection的框架页支持GZIP压缩,如AFNetworking。甚至有些云服务提供商已经提供发送经压缩过的响应内容,例如 Google App Engine。

  这里有一篇关于GZIP压缩很好的文章,介绍了如何在Apache活IIS服务器中开启支持GZIP压缩。

  文章连接:http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/