iOS开发-开发总结(七)
if let gestures = navigationController?.view.gestureRecognizers { for recognizer in gestures { if recognizer.isKindOfClass(UIScreenEdgePanGestureRecognizer) { scrollView.panGestureRecognizer.requireGestureRecognizerToFail(recognizer as! UIScreenEdgePanGestureRecognizer) println("Require UIScreenEdgePanGestureRecognizer to failed") break } } }
在网上有太多让人迷惑和错误的信息, 这次 WWDC 本身也没有去描述细节。幸运的是, 在 HOKO 我们在我们的智能链接上添加了这一特性, 所以我们可以无缝的引导用户到 APP 上。
什么是通用链接?
很显然 Apple 正在大力推动 APP 开发者在深层链接上有更好的体验。所有的消息都围绕着深层链接技术。与此同时, Apple 推出通用链接:一种能够方便的通过传统 HTTP 链接来启动 APP, 使用相同的网址打开网站和 APP。
通 过唯一的网址, 就可以链接一个特定的视图到你的 APP 里面, 不需要特别的 schema 。试想一下 Twitter 使用了通用链接, 那么你每在 twitter。com 点击一个链接, 你的 iOS 设备都会在 Twitter 里面自动打开这个页面, 而不是当你没有安装时转到普通的网页。这个用户体验是顺畅的, 最重要的是用户不会失去上下文(跳到 APP 后 Safari 上不再留下空标签)三:WKWebView
WKWebView 是苹果在 iOS 8 中引入的新组件,目的是给出一个新的高性能的 Web View 解决方案,摆脱过去 UIWebView 的老旧笨重特别是内存占用量巨大的问题。
苹果将 UIWebViewDelegate 与 UIWebView 重构成了 14 个类和 3 个协议, 引入了不少新的功能和接口,这可以在一定程度上看做苹果对其封锁 Web View 内核的行为作出的补偿:既然你们都说 UIWebView 太渣,那我就造一个不渣的给你们用呗~~ 众所周知,连 Chrome 的 iOS 版用的也是 UIWebView 的内核。
WKWebView 有以下几大主要进步:
-
将浏览器内核渲染进程提取出 App,由系统进行统一管理,这减少了相当一部分的性能损失。
-
js 可以直接使用已经事先注入 js runtime 的 js 接口给 Native 层传值,不必再通过苦逼的 iframe 制造页面刷新再解析自定义协议的奇怪方式。
-
支持高达 60 fps 的滚动刷新率,内置了手势探测。
在上面的两种用法中,错误都被丢弃。如果不丢弃,可以这样:
if (!(value = [instance request:blah withError:&error])) { ...print error and return/die... }
或者
if let value = instance.request(blah, error:&error) { ...success.. } else { ...print error and return/die... }
或者
do { let value = try instance.request(blah) } catch {... print error and return/die ...}
你工作所用的系统会自动把错误值归为nil的环境下。因此,你将得到:
-
Swift 的nullable optional类型和它的错误系统可以交互操作。例如,你可以编写throwing函数,并用if-let实现它。
-
函数调用的成功或者失败的关注点在于调用的上下文独立承担的错误报告。“我尝试做X这件事,但是它失败了”,传统的错误是描述哪里出错,但是现在描述的是你刚刚在做什么。
你失去的:
-
Cocoa-style错误处理。任何错误都会被忽略,你不会看到或知道它们。
-
错误来源信息例如文件/程序产成的问题。你知道的是调用栈出错,但是不知道原因也不知道如何出现的。
-
Railway/Freight Train-style开发模式,正如Jeremy Tregunna所说的那样,“作为单子输入和输出的代码,左边产生错误信息,右边产生成功的值;绑定函数和运算符,自动地从调用栈里面找到所有的错误”。
- 1:NSProxy 是一个虚基类,它为一些表现的像是其它对象替身或者并不存在的对象定义一套API。一般的,发送给代理的消息被转发给一个真实的对象或者代理本身load(或者将本身转换成)一个真实的对象。NSProxy的基类可以被用来透明的转发消息或者耗费巨大的对象的lazy 初始化。
- 2:NSProxy的消息转发机制可以用来替换C++中的多重继承
- 3:NSProxy实现了包括NSObject协议在内基类所需的基础方法,但是作为一个虚拟的基类并没有提供初始化的方法。它接收到任何自己没有定义的方法 他都会产生一个异常,所以一个实际的子类必须提供一个初始化方法或者创建方法,并且重载forwardInvocation:方法和 methodSignatureForSelector:方法来处理自己没有实现的消息。一个子类的forwardInvocation:实现应该采取所有措施来处理invocation,比如转发网络消息,或者加载一个真实的对象,并把invocation转发给他。methodSignatureForSelector:需要为给定消息提供参数类型信息,子类的实现应该有能力决定他应该转发消息的参数类型,并构造相对应的NSMethodSignature对象。详细信息可以查看NSDistantObject, NSInvocation, and NSMethodSignature的类型说明
- 1:通过@synthesize 指令告诉编译器在编译期间产生getter/setter方法。
- 2:通过@dynamic指令,自己实现方法。
- 1:在NSManagerObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,core data 框架会在程序运行的时候为此类属性生成getter和setter方法
- 2:Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足