背景:这本书跟我们做互联网产品相关,尤其是在做一款创新型人工智能产品时,需要团队成员能有互联网思维,通过互联网方法,能为了一致的目标团结一起,将产品做到极致。不过书中谈到的很多都是前几年吵的比较火的概念,自己也一直在互联网圈子里,所以对他提到的观点和看法也是了解的。
不得不说,这本书讲的还是非常通俗易懂的,老周从自己的做360的初衷、过程及遇到的问题和解决方式思维,多个角度分析了自己在互联网这块的认识和简介。简单来讲就是,以免费带量,靠增值服务来赚钱;用户至上,体验为王。
爱生活,有理想,会思考,能沟通!
不得不说,这本书讲的还是非常通俗易懂的,老周从自己的做360的初衷、过程及遇到的问题和解决方式思维,多个角度分析了自己在互联网这块的认识和简介。简单来讲就是,以免费带量,靠增值服务来赚钱;用户至上,体验为王。
苹果原生NSJSONSerialization
原生有一些解析未进行容错处理
//如:如何被解析的JSON数据如果既不是字典也不是数组(比如是NSString), 那么就必须使用这
|
|
SBJSON 、JSONModel
字典转模型框架:
a.Mantle 需要继承自MTModel
b.JSONModel 需要继承自JSONModel
c.MJExtension 不需要继承,无代码侵入性(运行时)
注意点:json解析中,jsonkit解析空数据时会变成NSNull类型,既不是nil也是string。解决方案可以使用NullSafe
使用afnetwork时可以设置self.removesKeysWithNullValues = YES;
源文件简而言之:AFHTTPSessionManager -> 简单的HTTP请求封装
AFURLSessionManager -> 网络通信核心,负责调配NSURLSession启动网络任务,设置session代理的转发、操作回调线程执行、组装参数及解析参数的调配等
AFNetworkReachabilityManager -> 网络状态监控
AFSecurityPolicy -> 网络安全策略
AFURLRequestSerialization/AFURLResponseSerialization -> 数据序列化和反序列化
工具包AF UIKit -> 图片下载及缓存策略,网络请求时状态栏上的菊花出现时机等
追问:self.operationQueue.maxConcurrentOperationCount = 1 AF3.x中操作队列并发线程数设置为1的目的?
需要准备一张visa卡(本人使用的是招行visa信用卡),在google cloud platform注册账号信息
说明:GCP新用户有免费一年的使用时长,配额是300美金
关于iOS 8后出来的WKWebview的简介,及对比UIWebview的优势 就不再做赘述了。可以参考
nshipster介绍WKWebview
学习WKWebview需研究源码,可以调试下miniBrowser项目
在WKWebview出来这几年后,老项目一直未迁移到wkwebview,尽管我们知道它有着60 fps滚动刷新率,内存占用少,和safari相同的JavaScript引擎等优势,但由于其本身的不完善和一些坑点以及迁移的工作量等问题,一直未深入研究迁移方案。
但多个UIWebview浏览的内存暴涨导致容易crash一直是块心病。于是还是尝试迁移到wkwebview,便有了一段踩坑之旅。
hopper:对脱壳app进行反汇编、反编译 可以分析app二进制文件
dumpdecrypted:用于脱壳
class-dump:对脱壳app 导出头文件
越狱设备一台(当时是6s Plus ,ios9.2)
越狱后安装有 cydia ,通过cydia安装openSSH,可以通过网段连接到mac
线程知识:
线程是任务分解成不同的工作单元分配给线程去执行,解决了多任务并发执行的问题,提高了系统性能。在现代交互式系统中,还存在大量的未知不确定的异步事件,这时候线程是一直是出于等待状态的,直到有事件发生才会唤醒线程去执行,执行完成后系统又恢复到以前的等待状态。
如何控制线程在等待和执行任务状态间无缝切换,就引入了RunLoop的概念。
RunLoop称为事件循环,可以理解为系统中对各种事件源不间断的循环的处理。
应用在运行过程中会产生大量的系统和用户事件,包括定时器事件,用户交互事件(鼠标键盘触控板操作),模态窗口事件,各种系统Source事件,应用自定义的Source事件等等,每种事件都会存储到不同的FIFO先进先去的队列,等待事件循环依次处理。
被RunLoop管理的线程在挂起时,不会占用系统的CPU资源,可以说RunLoop是非常高效的线程管理技术。
RunLoop的作用:
客户端网络层交互流程:
注:此处还应该有个 数据持久化
流程,因项目业务层逻辑及存储方案各不相同,本篇中不展开介绍
另:本篇幅中暂时只涉及到HTTP的请求,TCP及UDP的网络交互处理又不一样,需要考虑的也不相同(如:TCP考虑包顺序处理及回调分发问题,UDP考虑丢包及无序处理)
记录: iOS TCP链接使用
GCDAsyncSocket
库;
UDP简单实现丢包处理方法,给文件分块,每个数据包的头部添加一个唯一标识序号的ID值,当接收到的包头部ID不是期望中的ID号,则判定丢包,将丢包ID发回服务端,服务端接收到丢包响应则重发丢失的数据包
UDP模拟TCP协议三次握手,这样对丢包处理有帮助
本文是博主15年读casa中网络层设计方案的记录与思考总结。
14年底到15年年初的工作一言难尽,自己从嵌入式转到iOS开发,新的平台新的部门都需要重新学习和提高,压力可想而知。年初终于在我们大C司定岗,正式成为一个iOS开发,非常感谢我的三位iOS启蒙导师(李思哥哥、陆爷、彦群),他们帮助我跨过前期的障碍,也看到移动开发技术的未来。总体来讲,自己看到既年轻又活跃的天空,跟着团队也逐步认识到了一个创业团队的磨合期和碰撞期。风云变幻,莫笑少年愁。
死锁(deadlock) 通常是当多个线程在相互等待着对方的结束时,就会发生死锁,这时程序可能会被卡住。此时就导致了deadlock!
在使用GCD的时候,我们会把需要处理的任务放到Block中,然后将任务追加到相应的队列里面,这个队列,叫做Dispatch Queue。然而,存在于两种Dispatch Queue,一种是要等待上一个执行完,再执行下一个的Serial Dispatch Queue,这叫做串行队列;另一种,则是不需要上一个执行完,就能执行下一个的Concurrent Dispatch Queue,叫做并行队列。这两种,均遵循FIFO原则。
dispatch_get_global_queue
为全局并行队列
dispatch_get_main_queue
为主线程串行队列
为了区分线上版本、测试版本以及调试版本,我们在开发过程中一般会修改bunlde Id以便在一个设备上安装不同版本的App。然而问题来了,如何快速区分出桌面上的App是什么版本呢?最直观的就是改变App图标,达到显而易见的目的。
在看了这篇译文后,利用脚本可以非常便利的实现这个需求(这是原文)。虽然译文翻译有些问题,但还是确实让大家能伸手一把(原文作者真心是手把手教学)。