WWDC2018—What's New in Cocoa Touch

栏目: IOS · 发布时间: 5年前

内容简介:这篇文章是对WWDC2018关于在iOS12中首先对scrollview的滑动做了2. 将model数据传入cell,而这一步具体的消耗如何就要看数据的获取方式了,你可能从数据库中获取,也可能从网络中获取,总之这可能是一个相当耗时的工作。

这篇文章是对WWDC2018关于 Cocoa Touch新特性 的翻译与总结。在What's New in Cocoa Touch这个session中,主要分为三个topic来讲的,下面一个一个来看。

一、Framework updates

一、性能优化方面

1、scrolling

在iOS12中首先对scrollview的滑动做了 预加载数据CPU计算优化 。主要以UITableview的加载来进行了举例。UITableview在显示的时候分为这几步。 1. 先从缓存队列中取出一个cell或者是直接创建一个cell

2. 将model数据传入cell,而这一步具体的消耗如何就要看数据的获取方式了,你可能从数据库中获取,也可能从网络中获取,总之这可能是一个相当耗时的工作。

3. cell调用layoutSubviews为子视图布局

4. 调用draw()方法绘制view,也就是drawInRect方法进行绘制。这里cell所有的子view都要调用一遍,我们还可能填充文字等,所以这一步也可能需要较大的时间开销

在这种cell的展示方式中,这四步都必须要在cell展示的那一帧时间内(1/60秒)完成,才能保证不卡顿。为了让cell计算的速度尽可能快,所以在iOS12中有了prefetch API,这个API可以提前异步的去进行数据的获取,所以在滑动的时候绘制Cell那一帧时间里就省去了数据获取的步骤,只负责cell的绘制就够了,这样就大大节省了CPU的开销。

UITableViewDataSourcePrefetching 这个protocol中,也就两个方法:

protocol UITableViewDataSourcePrefetching {  
 func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath])
 func tableView(_ tableView: UITableView, cancelPrefetchingForRowsAt: indexPaths [IndexPath])
}

这两个方法中必须实现的就是 prefetchRowAt 这个方法,你可以把一些耗时的数据获取工作放在这个方法中。这样就可以在cell显示之前提前获取数据而不用等到cell绘制的时候另外占用CPU开销。

后面发现了一个case。如果在cell load过程中同时进行prefetch,就会造成在绘制当前cell的时候既要load当前cell,还要去prefetch下一个即将显示的cell,这样就会造成绘制当前cell的时候CPU开销太大。

WWDC2018—What's New in Cocoa Touch

所以在后面有了改进,如下图所示,它是在当前cell load完成的时候去异步prefetch下一个cell的数据的。这样就避免prefetch对当前cell绘制的影响。

WWDC2018—What's New in Cocoa Touch

另外还发现了一个case,如果在设备并没有满载的时候,这个时候只是运行了一个简单的前台程序的滑动工作,CPU并不知道将来的工作到底如何,它可能就会使用尽可能低的level进行工作以进行省电。但是这个时候如果来了复杂的计算(需要绘制复杂的cell),等CPU提高level再去进行计算,可能就会太迟了,就很容易造成卡顿。这个时候CPU的工作方式如图:

WWDC2018—What's New in Cocoa Touch

因此在iOS12中,会提前把要绘制的信息告诉CPU,如果有复杂的任务,CPU就会提前进入高的level,这样提前了解App需要的CPU占用情况,就能让CPU及时改变它的level。所以在iOS12中CPU会尽可能的根据你的应用的需求情况来进行调整,这样在达到了省电的同时还能充分利用CPU保证流畅性,确实很棒!

WWDC2018—What's New in Cocoa Touch

2、Memory

首先强调了一下memory对性能影响的重要性,然后介绍了一下App在运行的时候,内存的使用情况

WWDC2018—What's New in Cocoa Touch

当你请求一个小的内存的时候,此时内存足够,就会直接获取free memory,但是现在当你的App申请一个较大的内存的时候,这个时候就很可能内存不足,系统就会从Other Apps and System中去获取,也就是其它那些在后台中的进程。虽然这能满足我们的需求,但它仍然可能在其它地方产生未知的影响。而且这个过程对于我们的App来说依然会占用很多时间,所以其实对我们的应用也是有影响的。因此找到一些方法来节约内存对于我们的App来说会有很大的提升。下面就讲到了iOS12中对图片的一个优化。

WWDC2018—What's New in Cocoa Touch

以上面两个图来说,他们的内存大小都是每个像素64位这样来计算的。但其实第二张图并没有完全利用所有的color位数,因为它只有黑白两种颜色,显然这造成了对内存的浪费。所以在iOS12中只使用了8位,所以第二种图片在使用了Automatic Backing Store后的内存占用缩减成了下面这样,这对于App的内存占用是一个很大的提高。

WWDC2018—What's New in Cocoa Touch

Automatic Backing Store在iOS12的SDK中默认会在下面这三种方法中进行

  • UIView.draw()
  • UIGraphicsImageRenderer
  • UIGraphicsImageRenderFormat.Range

所有与图片渲染相关的API都可以使用Automatic Backing Store,如果想要了解详细使用情况的话,可以看这个session( Image and Graphics Best Practices

3、autolayout

Autolayout在iOS12中也进行了较大的提升。

首先是对于互不相关的兄弟视图来说,虽然在iOS12之前随着视图的增多计算的复杂度就已经是线性增加的了,但是iOS12中通过团队的努力还是把计算复杂度尽其所能的进行了降低。

WWDC2018—What's New in Cocoa Touch

然后再说更加复杂的约束相互有依赖的视图,iOS12之前随着视图的增多,frame的计算复杂度是在呈指数上涨的。所以之前使用autolayout的话性能瓶颈是很明显的,稍微复杂一点的视图我们可能都会放弃autolayout。但是在iOS12中,autolayout的计算不再呈指数上涨了。通过优化也已经实现线性增加的复杂度。对于嵌套视图来说,也是如此,复杂度由指数级下降至线性级。

WWDC2018—What's New in Cocoa Touch

这样一来, iOS12以后使用autolayout我们也不用太担心性能瓶颈问题了 ,这确实是一件值得兴奋的事。更多相关内容,可以查看这篇session( High Performance Auto Layout )

二、Swiftification

主要讲了swift有以下几点增强,总结一下就是让swift感觉更加swift了。

  • Types 主要就是一些全局type加入到了类中,让我们使用起来更加方便。下面给了一些例子:
// Swift 4
enum UIApplicationState {  
 case active
 case inactive
 case background
}
// Swift 4.2
class UIApplication : UIResponder {  
 enum State {
   case active
   case inactive
   case background
  }
}
// Swift 4
enum UITabBarItemPositioning {  
 case automatic
 case fill
 case centered
}
// Swift 4.2
class UITabBar : UIView {  
 enum ItemPositioning {
   case automatic
   case fill
   case centered
  }
}
  • Constants 一些全局常量也被加入到了相关类中,如下面一些例子:
// Swift 4
class NSNotification : NSObject {  
 struct Name {
   class let didChangeStatusBarOrientation: NSNotification.Name
 }
}
let UIApplicationStatusBarOrientationUserInfoKey: String

// Swift 4.2
class UIApplication : UIResponder {  
 class let didChangeStatusBarOrientationNotification: NSNotification.Name
 class let statusBarOrientationUserInfoKey: String
}
// Swift 4
let UIFloatRangeZero: UIFloatRange  
let UIFloatRangeInfinite: UIFloatRange  
// Swift 4.2
struct UIFloatRange {  
 static let zero: UIFloatRange
 static let infinite: UIFloatRange
}
  • Fundations 还有一些全局函数也被移进了相关类中,如下一些例子:
let insets = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)  
let image = UIImage(named: “Apple”)  
// Swift 4
let insetRect = UIEdgeInsetsInsetRect(originalRect, insets)  
let pngData = UIImagePNGRepresentation(image)  
// Swift 4.2
let insetRect = originalRect.insetBy(insets)  
let pngData = image.pngData()
// Swift 4
NSStringFrom[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]  
[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]FromString
// Swift 4.2 – Codable Conformance
let encoded = JSONEncoder().encode(CGPoint(x: 0, y: 0))  
let decoded = JSONDecoder().decode(CGPoint.self, from: encoded)
// Swift 4
NSStringFrom[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]  
[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]FromString
// Swift 4.2 — Codable Conformance
let encoded = JSONEncoder().encode(CGPoint(x: 0, y: 0))  
let decoded = JSONDecoder().decode(CGPoint.self, from: encoded)  
// Swift 4.2 — Debug Printing
print(CGPoint(x: 0, y: 0))  
print(“Offset: \(UIOffset(horizontal: 10, vertical: 10))”)
// Swift 4
NSStringFrom[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]  
[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]FromString
// Swift 4.2 — Codable Conformance
let encoded = JSONEncoder().encode(CGPoint(x: 0, y: 0))  
let decoded = JSONDecoder().decode(CGPoint.self, from: encoded)  
// Swift 4.2 — Debug Printing
print(CGPoint(x: 0, y: 0))  
print(“Offset: \(UIOffset(horizontal: 10, vertical: 10))”)  
// Swift 4.2 — Legacy Encoding/Decoding
let encoded = NSCoder.string(for: CGPoint(x: 0, y: 0))  
let decoded = NSCoder.cgPoint(for: encoded)

另外还增加了安全的编解码API,但是这里并没有详细介绍,如果想要了解的话可以看这篇session( Data You Can Trust )

二、API 的改善

1、通知

在iOS12中通知有了很多很大的提升,但是今天只讲以下三个方面。

  • 交互

iOS12在通知中可以有更多的交互,现在的交互动作也不再是静态的,比如iMessage甚至可以直接回复信息

WWDC2018—What's New in Cocoa Touch

  • 消息分组

iOS中的notification已经默认支持分组,也就是说默认情况下一个应用的通知都会被分为一个group进行展示。当然你也可以进行个人定制,可以通过给通知标记thread identifier,这样所有有相同的thread identifier的通知都会出现在同一个group。

WWDC2018—What's New in Cocoa Touch

  • 设置

iOS12新的的通知UI增加了Notification settings。Notification settings支持用户根据他们自己的行为定制个性化的通知,或者

你也可以通过iOS12中一个新的API来为用户深入定制与你应用相关的setting。

WWDC2018—What's New in Cocoa Touch

更多与Notification相关的内容可以查看这两个session What’s New in User NotificationsUsing Grouped Notifications

2、短信

在iOS12中iMessage增加了camera中的一些新特性,只要我们在xcode中创建sticker template,我们创建的贴纸就会自动加入messages和相机中。除此之外,如果你想创建更加定制化的贴纸的话,你可以使用 MSMessages App ViewController ,并在info.plist中配置如下参数

<key>MSSupportedPresentationContexts</key>  
<array>  
    <string>MSMessagesAppPresentationContextMessages</string>
    <string> MSMessagesAppPresentationContextMedia</string>
</array>

这两个参数让你的贴纸既可以在messages中使用,也可以在相机中使用,当然你也可以选择某一个。 你可以通过以下新的API判断你的messages app是处于messages中还是相机中。

enum MSMessagesAppPresentationContext : UInt {  
  case messages 
  case media 
}

还有一个小改动就是之前左右滑动会进行messages app的切换,现在左右滑动的手势不会产生切换了,也就是说你的messages app支持左右滑动了。(这个对比一个iOS11和iOS12的iMessage就可以看到)

3、密码和验证码的自动填充

在iOS12中,你只需要将你的登录输入框设置为 password text content type 或者将注册输入框(密码修改输入框)设置为 new password text content type ,系统就会自动识别,提示用户将密码存入iCloud的keychain中,并且在用户下次输入的时候自动填充密码。

WWDC2018—What's New in Cocoa Touch

WWDC2018—What's New in Cocoa Touch

另外在短信验证中,获取验证码后也就不用来回切换app了,系统会自动识别验证码。

WWDC2018—What's New in Cocoa Touch

总之,在strong passwords的使用下,我们再也不用为各种各样的密码和验证码而烦恼啦。更多详细内容可以看这篇session Automatic Strong Passwords and Security Code AutoFill

4、安全区以(safeArea)

safeArea可以确保我们的内容不会超出内容正确显示范围,比如一些top bar,bottom bar啥的。safeArea的计算其实是非常复杂的,它会根据不同的设备进行不同的比例缩放。总之它给了我们一个安全的区域让我们去填充我们的视图。

WWDC2018—What's New in Cocoa Touch

WWDC2018—What's New in Cocoa Touch

safeArea其实不是什么新内容,不过这里再次强调可以看出苹果对safeArea的重视,而且苹果官方很鼓励我们去使用safeArea,所以我们以后自定义视图的时候一定要注意根据safeArea去布局,不要超出safeArea的范围。

最后有一个相关的session推荐 UIKit: Apps for Every Size and Shape

三、Siri shortcuts

iOS12中新增的主要有两个API,这两个API让你不仅可以与Siri有一些常见的简单的互动,还可以在一些复杂的场景中有一些更加定制化的互动。

1、NSUserActivity

NSUserActivity是一个简单的API,它可以被用于简单的切换和唤起。虽然简单,但是在一些场景中它也可以发挥巨大的作用,比如你可以通过它返回到应用中的某一指定页面。比如你正在看某一条信息或者文件的时候,可以通过它在另一个设备跳转到相同的位置。而是用起来也很简单,只需要一行代码搞定

Set eligibleForPrediction = true

2、SiriKit

如果你想使用更多定制化的内容的话,就可以使用它了。它包含的内容很多,如图所示:

WWDC2018—What's New in Cocoa Touch

这些是一些去年都已经有的内容,在iOS12中,你可以定义自己的内容。 这里也只是简单的介绍了一下,想要详细了解的话这里推荐了三篇session


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Agile Web Development with Rails, Third Edition

Agile Web Development with Rails, Third Edition

Sam Ruby、Dave Thomas、David Heinemeier Hansson / Pragmatic Bookshelf / 2009-03-17 / USD 43.95

Rails just keeps on changing. Rails 2, released in 2008, brings hundreds of improvements, including new support for RESTful applications, new generator options, and so on. And, as importantly, we’ve a......一起来看看 《Agile Web Development with Rails, Third Edition》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具