码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发-开发总结(七)

时间:2016-07-02 18:46:27      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

一:手势与ScrollView兼容问题
 
倘若在 ViewController 中添加了一个 TableView,那么很可能在侧滑返回的时候,反而先触发了 TableView 的上下滚动,这一点是非常恼人的。
 
通过 requireGestureRecognizerToFail() 这个方法,就可以很好的处理这个问题。
技术分享
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 2015 上, Apple 为 iOS 9 宣布了一个所谓 通用链接 的深层链接特性, 视频地址为 [无缝链接到您的 App]。虽然它不是一个必须实现的功能, 但还是需要引起一些注意。

在网上有太多让人迷惑和错误的信息, 这次 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 有以下几大主要进步:

  1. 将浏览器内核渲染进程提取出 App,由系统进行统一管理,这减少了相当一部分的性能损失。

  2. js 可以直接使用已经事先注入 js runtime 的 js 接口给 Native 层传值,不必再通过苦逼的 iframe 制造页面刷新再解析自定义协议的奇怪方式。

  3. 支持高达 60 fps 的滚动刷新率,内置了手势探测。

 
Swift中try的使用
技术分享

 

在上面的两种用法中,错误都被丢弃。如果不丢弃,可以这样:

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所说的那样,“作为单子输入和输出的代码,左边产生错误信息,右边产生成功的值;绑定函数和运算符,自动地从调用栈里面找到所有的错误”。

 
四:NSproXY
  • 1:NSProxy 是一个虚基类,它为一些表现的像是其它对象替身或者并不存在的对象定义一套API。一般的,发送给代理的消息被转发给一个真实的对象或者代理本身load(或者将本身转换成)一个真实的对象。NSProxy的基类可以被用来透明的转发消息或者耗费巨大的对象的lazy 初始化。
 
  • 2:NSProxy的消息转发机制可以用来替换C++中的多重继承
 
  • 3:NSProxy实现了包括NSObject协议在内基类所需的基础方法,但是作为一个虚拟的基类并没有提供初始化的方法。它接收到任何自己没有定义的方法 他都会产生一个异常,所以一个实际的子类必须提供一个初始化方法或者创建方法,并且重载forwardInvocation:方法和 methodSignatureForSelector:方法来处理自己没有实现的消息。一个子类的forwardInvocation:实现应该采取所有措施来处理invocation,比如转发网络消息,或者加载一个真实的对象,并把invocation转发给他。methodSignatureForSelector:需要为给定消息提供参数类型信息,子类的实现应该有能力决定他应该转发消息的参数类型,并构造相对应的NSMethodSignature对象。详细信息可以查看NSDistantObject, NSInvocation, and NSMethodSignature的类型说明
 
 
五:@synthesize,@dynamic区别
SDK中描述是在声明property的时候,有2个选择
  • 1:通过@synthesize 指令告诉编译器在编译期间产生getter/setter方法。
  • 2:通过@dynamic指令,自己实现方法。
有些存取是在运行时动态创建的,如在CoreData的NSManagedObject类使用的某些。如果你想这些情况下,声明和使用属性,但要避免缺少方法在编译时的警告,你可以使用@dynamic动态指令,而不是@synthesize合成指令
 
Objective-C 2.0 中增加了@dynamic 指令,表示变量对应的属性访问器方法,是动态实现的
比如:对于接口中的height在实现类中使用了@dynamic指令,紧接着,你需要指定一个函数或者其他类的方法作为height的setter、getter方法的运行时实现
 
熟悉object-c语法的都知道@synthesize实际的意义就是 自动生成属性的setter和getter方法。
@dynamic 就是要告诉编译器,代码中用@dynamic修饰的属性,其getter和setter方法会在程序运行的时候或者用其他方式动态绑定,以便让编译器通过 编译。应用:
  • 1:在NSManagerObject对象的属性声明上,由于此类对象的属性一般是从Core Data的属性中生成的,core data 框架会在程序运行的时候为此类属性生成getter和setter方法
  • 2:Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足

iOS开发-开发总结(七)

标签:

原文地址:http://www.cnblogs.com/stronger-ios-lcx/p/5635743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!