目录
1.UITableView滑动卡顿的优化

2.右滑手势返回

3.添加页面统计

4.debug版和release版

5.关于页面刷新

6.关于页面布局

7.推荐博客

遇到问题和解决方案

本文是Java转iOS-第一个项目总结(1)?的内容补充,分析遇到的一些问题和解决方案,分享一些收获。

1.UITableView滑动卡顿的优化

因为 `UITableView`的cell中有很多图片,在4/4s上滑动比较卡,最开始觉得是机器太老了,但是对比微信和QQ空间,发现还是我们的问题,所以后期进行了优化,通过xcode的性能监控,内存变化不大,但是cpu飙升的俩厉害,通过xcode的Time Profiler工具进行了监控(Product—Profile—Time Profiler),找到了执行比较慢的方法,原因是转换图片路径的时候,调用自己的方法进行了log打印,造成滑动卡顿。

网上关于UITableView的性能优化的文章有很多,官方给了一个例子LazyTableImages介绍懒加载UITableview的Image,在滑动的时候,不加载图片,停止滑动时再加载图片,并把UIImage放在对象中,判断对象中图片不会空则显示图片,否则还是占位图。例子中图片都是app的icon,都是小图,所以那样做也没问题。但是我们项目中的图片都是大图片,如果把图片放在对象中,显然不合适,所以当时pass了这个方案。

前几天在Glow 技术团队博客看到了UIScrollView 实践经验

这篇博客,里面讲到了相同的技术,优化了滑动减速过程中也进行图片加载,另外用到了SDWebImage,里面判断SDWebImage是否缓存过图片,如果缓存过,从本地加载图片,否则使用占位图,应该是比较好的解决方案了

2.右滑手势返回

iOS7自带了这个功能,后来设计人员提出了优化建议,但我们的程序却不能支持这个功能,原因程序返回操作的方法包含其它业务逻辑,比如返回后刷新上一页面的数据,返回后是否显示底部菜单。而系统的默认的右滑返回,只是做了页面返回,并不会触发自己的返回方法。

所以为了这个功能还是代码进行了修改,更新上级页面的操作放在本页面数据刷新的地方。底部菜单只在首页的几个页面显示隐藏,其它去掉相关业务逻辑。因为改这个地方还和测试起了冲突,因为项目临近收尾,修改可能会带来问题,优化的功能可以放在后期。但是作为开发人员还是进行了修改,加班进行了测试。表面上看这是个优化,其实却是问题暴漏。如果有新需求的可以不做,但是有问题却应该尽早解决。

另外这个地方做个内容补充,页面之间的逆向数据传递,可以用回调(block)、委托(delegate)和通知(notifacation),需要熟练掌握这几个知识点以及实现方法,区分之间的差别。

3.添加页面统计

友盟统计还是比较强大的,虽然项目没有要求加相关功能,但是还是加了相关统计,需要在对应ViewController中的viewWillAppear和viewWillDisappear中加入一行代码,传入当前页面的名字,最开始只加了几个页面,所以代码是写死的。全部页面要加统计,需要对代码进行了改进,封装在自己BaseViewController中

1
2
3
4
5
6
7
8
-(void)beginLogPageView
{
    [MobClick beginLogPageView:NSStringFromClass([self class])];
}
-(void)endLogPageView;
{
    [MobClick endLogPageView:NSStringFromClass([self class])];
}

在子页面中调用统计就比较简单了

1
2
3
4
5
6
7
8
9
10
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    //添加页面统计
    [self beginLogPageView];
}
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    //结束页面统计
    [self endLogPageView];
}

Method Swizzling和 AOP实践里面提供了更高大上的解决方案,顺便可以学习OC的runtime

在Java领域中,Spring框架以IOC和AOP著称,所以语言和涉及里面都是想通的。虽然作为io是新手,但是我是懂AOP的_。

4.debug版和release版

之前自己对于debug版和release版没有太多概念,只是知道平时开发的时候是debug版,当要发布的时候改成release版,看到一些宏定义,根据不同版本设置不同的宏,比如debug版的时候,NSLog可以输出,release的时候不输出。

前段时间,看到一篇Xcode宏定义选项以及Release版去NSLog的文章时,就想明白了,在xcode中可以设置宏,debug下有个默认设置 debug=1,所以

1
2
3
4
5
#if DEBUG    
#warning NSLogs will be shown
#else
#define NSLog(...) {}
#endif

应该就是判断这个值

在之前的JavaWeb项目中,我们会使用Maven进行项目管理,在Maven的pom.xml可以添加profiles,配置不同的版本,比如开发版,测试版,生产版,不同版本下有不同的配置文件,比如数据库连接,log配置等,打包编译项目时可以通过Maven选择不同的版本。这样的好处是切换版本的时候,不用修改相关带代码,避免出现不必要的错误。

转iOS后一直在找相关的解决方案,后来才意识到这个就可以做到,只不过苹果里面只有debug版和release版,没办法自定义新的版本(或者是我还没找到,请大神赐教),但是也可以进行相关配置,保证release版的配置都是正确的

另外补充一下,在C/C++中重复引用头文件会出错,所以头文件引用的时候可以使用下面方法,自定义头文件的引用名,xcode生成头文件的时候也会默认加上这个

1
2
3
#ifndef xxxx
#define xxxx
#endif

所以就会引起一个疑问,自己平时在程序中如果不是这样引用头文件,是否会引起冲突,网上搜索给出答案。oc中不推荐#include引用头文件,推荐使用#import就是可以解决这个问题的。

5.关于页面刷新

一个页面,可能包括下拉刷新,上拉加载更多,翻页到最后时隐藏刷新,没网下从缓存中加载数据等多种情况,所以页面刷新的功能最好提前考虑到,否则这些功能在后期修改时会变得很麻烦,一不小心就容易出问题。比如翻页到最后隐藏加载更多,然后下拉刷新的时候,可能需要把隐藏的控件给显示出来。所以代码要考虑好,设计好,封装好。

6.关于页面布局

现在的iOS教程,大部分讲得都是故事板,但是在实际项目中,更多的还是用代码。

唐巧的博客StoryBoard–看上去很美中说明了原因,公司项目多是协同开发,一旦两个人同时修改了故事板,基本上都会产生冲突,解决起来会非常麻烦,所以作为新手还是应该多学习纯代码开发。之前项目使用的就是代码写UI,获得屏幕宽高,在不同控件之间算坐标,如果代码不规范,控件的坐标和宽高是独立的,如果一个控件发生变化,就会产生雪崩。

这里推荐Masonry,也是github上非常有名的一个iOS组件,解决了自动布局写约束麻烦且繁琐的缺点,比较容易学习和令人接受。iOS还有个VFL语言,相比还是Masonry感觉更好。

这里再推荐一个iOS组件--ReactiveCocoa,是一个kvo组件,用来做消息监听,效果就是可以像Java写事件监听一样写OC代码 。之前给一个UIButton绑定事件,需要调用addTarget绑定,然后再写一个方法,或者监听UITextFiled的变化,都要写很多委托方法。使用ReactiveCocoa后,写法就大变了,代码看起来会整洁很多,而且显得比较高大上一点。

现在新的项目中,添加使用了上面两个组件。

7.推荐博客

唐巧的技术博客,最早因为不知道唐巧被同事鄙视了下,从他的博客中可以看到iOS的变化,作者也是从Java转的iOS,博客也是通俗易懂,现在博主自己创业虽然不写博客了,但是会发周报分享比较好博文和开源项目。

Glow 技术团队博客,虽然里面就几篇博文,但都比较有用,而且是属于进阶提升型的。

Java转iOS-第一个项目总结(2):遇到问题和解决方案的更多相关文章

  1. 菜鸟成长日记之新手备忘录-IOS开发第一个项目总结

    2013年5月3号,开始找IOS开发工作(自学了大半年,做了一个功能不全的Demo,该出去见见世面了!),5月4号面试了第一家公司(是家刚成立一段时间的外包公司),5月5号第一家公司已二轮电话面试,5 ...

  2. 20175324王陈峤宇 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结

    20175324王陈峤宇 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 这次的结对作业是要求我们利用栈来设计一个计算器. 自动生成四则运算 ...

  3. 20175229许钰玮 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结

    20175229许钰玮 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 自动生成四则运算题目(加.减.乘.除). 既可以用前缀算法(波兰算法 ...

  4. 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结

    码云链接 https://gitee.com/A5320/pair_programming_code 需求分析 实现一个命令行程序,要求: 1.自动生成小学四则运算题目(加.减.乘.除) 2.支持整数 ...

  5. (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题

    我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...

  6. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  7. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  8. AndroidStudio第一个项目HelloWorld

    实验内容 在Android Studio中创建项目 创建并启动Android模拟器 项目的编译和运行 实验要求 在安装好的AndroidStudio上建立第一个工程 创建并启动Android模拟器 编 ...

  9. 自我总结(六)---(学习j2ee+j2ee第一阶段项目)

    自我完善的过程就是在不断的自我总结不断的改进. 学习了Struts2 Spring Hibernate. 十天前结束了这个课程.也考试了.这次考试老师说机试考的还不错.其实就是一个简单的用户登录,进行 ...

  10. java学习之即时通信项目实战

     项目总结:这次项目主要是根据视频来的,结果跟到一半感觉跟不上,慢慢自己有了自己的想法,决定自己先不看学习视频,自己先试着写. 总结写前面,算是写的第一个项目吧.项目中遇到几点问题,首先Scoket对 ...

随机推荐

  1. JAVA面试常见问题之进程和线程篇

    1.线程和进程的概念.并行和并发的概念 进程:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本 ...

  2. webapp-viewport 相关知识整理

    我们在开发移动设备的网站时,最常见的的一个动作就是把下面这个东西复制到我们的head标签中: <meta name="viewport" content="widt ...

  3. 使用requireJs进行模块化开发

    requireJs使用 requireJs 使用require.js的第一步,是先去官方网站下载最新版本. 下载后,假定把它放在js子目录下面,就可以加载了. <script src=" ...

  4. HDU1709

    /*  * 好奇怪的母函数  */ #include<cstdio> #include<cstring> #include<cmath> #include<a ...

  5. mybatis深入理解(七)-----MyBatis缓存机制的设计与实现

    缓存设计 MyBatis将数据缓存设计成两级结构,分为一级缓存.二级缓存: 一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存.一级缓存是 ...

  6. MacBook 启用或停用 root 用户

    启用或停用 root 用户 选取苹果菜单 () >“系统偏好设置”,然后点按“用户与群组”(或“帐户”). 点按 ,然后输入管理员名称和密码. 点按“登录选项”. 点按“加入”(或“编辑”). ...

  7. js 禁止复制粘贴

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键,其实是禁止快捷菜单,因为不光右键可以弹出这个菜单,键盘上空格 ...

  8. 一站式WPF--依赖属性(DependencyProperty)一

    Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能,这些服务通常统称为 WPF 属性系统.由 WPF ...

  9. 网站被攻击扫描SQL注入的日常记录

    我发了个博客,泄露了域名之后,便有人疯狂的尝试攻击我的站点,奈何我防守做得比较好,直接把网段封了,看到403还锲而不舍,我真是想给他颁奖了 查看ua,发现很多sqlmap的ua,肯定会是被刷了,只是运 ...

  10. mysql查询某个字段重复的数据

    查询某个字段重复的数据 ; 查询股票重复的营业厅 ;