在我们开始之前,我打算再听听今年的一个意见。请花点时间通过这个简短的调查向我们提供一些反馈。这将有助于我帮助你。如果你曾经和collectionview打过交道,你可能已经意识到这篇文章的价值。如果您不注意速度,这将是一个大问题,您的用户会让您知道。当您的滚动视图不如设备上的其他应用程序快时,您很快就会意识到。表格视图是每个初级iOS开发人员唯一使用的东西,他们很快就会感到困惑。本文将深入探讨您可能正在寻找的一些问题。龟兔赛跑表视图是许多应用程序用来显示结构化数据的交互式对象。充分利用它们是微不足道的,这使它们成为使用起来的曲折冒险。设计者在设计之初不考虑性能问题。设计师甚至可能是你自己。很快您将制作一个图像类型的应用程序,需要在单元格上显示大量信息。一开始它可能很快,但很快就会像乌龟一样慢下来。您希望您的Table视图像一片黄油一样光滑。如果还不错的话,您的应用程序的这些使用效果很快就会引人注目。加快您的表视图我们将通过一个表视图实施不佳的实际示例来探讨这些技巧。通常你会发现类图app会在一个imageview上做以下事情:下载图片(主要内容图片+用户头像图片)更新时间戳显示评论计算动态cell高度本例中我们打算着重分析以上几点.我建议你克隆演示目录(github)来体验一下它一开始有多糟糕。跳转到XMCFeedTableViewCell以查看其改进并感受其性能。重要的是要意识到,如果您在iphone6+上运行,优化可能感觉不那么好。不要忘记在旧设备上试用它。提示#1学习如何加速我可以写一整篇关于Instruments的文章。在这里,我会给你一个一般性的介绍,因为它会很有帮助。如果你对Instruments不是很有经验,我建议你在周末花点时间学习一些。当你想测量内存和时间消耗时,它们会对你有很大帮助。但是,当你开始做一个app的时候,在开发过程中会遇到很多问题,代码也会越来越差。这个时候,你可能没有时间考虑性能问题。但是重构是有潜力的。为了进行适当的重构,您应该花精力分析性能。因此,周末要探索的内容如下:1.打开您的项目并单击Product>Profile2.在此处选择Custom3.找到Add按钮并添加工具:Allocations、Time、Profile、Leaks4.观察您的应用程序,然后它的性能。例如,我们关心速度(但内存也是一个大问题)。我们需要什么工具?如果您选择TimeProfile,那么您是对的。让我们打开它并观察应用程序的运行情况。您可以在下方看到我们应用程序的概览。你所看到的只是我打开应用程序并尽可能快地上下滚动表格视图。这模拟了一个很好的“最坏情况”,我们可以据此采取行动。这个区域是当我开始滚动应用程序时将执行的代码,我们只是想知道在这个区域花费的时间。现在您可以开始处理我们上面讨论的代码了。双击这些行中的任何一行(***是顶行,这是消耗时间最多的地方)需要指出的是,加载Instruments时CallTree下的选项不会为您设置。你需要自己设置。提示#2避免阻塞主线程在这个例子中,您将看到第一个图像相关方法在下载数据并将其转换为图像对象时阻塞主线程。您应该尽量避免阻塞主线程,这对于集合中的交互式对象尤为重要。网络请求?让它们在后台(异步)运行并缓存传入的响应。您绝对不想重复处理任何操作。想象一下你的细胞被吸引了一段时间的沉默。您的单元格应仅显示已存储在您设备上的数据。这会让你感觉更好。提示#3重用单元格如果您花了一些时间学习iOS,那么抱歉。此建议适用于刚接触iOS的学生。您应该使用dequeueReusableCellWithIdentifier方法来获取表或集合中的单元格。如果不这样做,您就浪费了毫无意义的时间和数据。提示#4缓存下载的图像这肯定是您将在此处阅读的最重要的建议。如果您不缓存图像,您将遇到大问题。如果你重用本地图片,那么请使用UIImage:的imageNamed方法。请求JPG格式的图像将节省时间和资源。如果您从服务器获取图像,您可以轻松发送所需的准确图像。如果您从服务器获取图像,您可以轻松发送所需的准确图像。PNG文件会占用大量内存空间。如果您对此感到好奇,可以在示例中将JPG替换为PNG,以下载一系列PNG图像。使用SDWebImage或Heneke来管理图像。我在提供的示例中使用了Heneke,在此之前我没有听说过它,也没有听说过它有多好。Tip#5使用RichText标签是昂贵的麻烦使用RichText标签太昂贵了。尽可能避免使用它。问问自己是否真的需要这个。如果有,尽量做缓存。Tip#6cellheightcalculation如果你的表格有复杂的动态高度那么你需要缓存计算出的高度。考虑您希望这些高度立即可用的频率(尤其是对于集合视图)。Tip#7NsDateFormatter和富文本一样有问题,如果频繁初始化,日期格式器会导致大量内存消耗。理想情况下,您的Web端将为您提供可读的文本(比在***时间内进行计算要容易得多)。如果没有,您可以创建一个NSDateFormatter单例来使用。NSDateFormatter不是线程安全的,但在iOS7及更高版本中不再是这种情况。谢谢quellish提醒我这一点。Tip#8Transparency如果你能避免它,你创建的对象必须是不透明的(不透明,你看不透它)。如果您有透明图像,系统必须非常努力地重新绘制这些图像。其实你可以在模拟器中点击Debug>ClolorBlendedAreas来查看这些区域的问题。如果您看到红色,则表示这些区域是透明的。当您处理Collectionview时,这可能会非常耗时。理想情况下,您希望看到整个屏幕都是绿色的。这对于您的设计可能不可行,但请尝试减少您看到的红色数量。在示例中,您可以看到标签延伸到视图的末尾并且可以被清除。Tip#9不要过多地使用Xibs(如果可以的话,使用故事板)如果你使用Xibs,请小心。当您加载Xib时,整个内容都会加载到内存中(图像、隐藏视图)。但这不会发生在故事板中,它只是实例化当前正在使用的内容。在某些特殊情况下使用xibs是有意义的。例如,您可能想使用一些第三方框架,它们使用纯代码编写集合的UI部分。如果你想使用xib创建一个原型单元,你可以使用xib来完成。请注意不要超载。技巧#10使用CoreGraphics我很少需要这个,但是当你需要的时候你可以。使用CoreGraphics并在视图的drawRect方法中编写UI代码。挑战谁不喜欢好的挑战?让我们把它留在这里。本周花时间做以下两件事。了解如何使用Instruments(时间分析器、分配),通过测试图像缓存(关闭、打开、观察)来检查LearningInstruments的使用情况。https://github.com/mcgraw/dojo-table-performanceQuestionsandanswersNoquestionsyet!请发表评论或发送电子邮件至david@xmcgraw.com。外卖在iOS中的界面交互非常重要。这是不能妥协的。如果您不花时间巩固应用的设备端体验,人们可能会远离您。当我查看应用程序中的内容时,应用程序应该很流畅。轮到你了提高绩效的最佳秘诀是什么?我很想听听你的建议。有时间请在下方分享。
