[WWDC18 Review #2] What’s New in Cocoa Touch

Framework Updates

Cocoa Touch 프레임워크의 성능이 향상되었습니다. Session 202에서는 Scrolling, Memory, Auto Layout 성능 향상에 대해 설명하고 있습니다.

Scrolling

테이블 뷰와 컬렉션 뷰는 스크롤 성능을 높이기 위해서 재사용 매커니즘을 사용합니다. 재사용 큐에 사용 가능한 셀이 없는 경우 새로운 셀을 생성해야 하는데, 이 과정에서 CPU 사용량이 증가하면서 스크롤 성능에 영향을 주게 됩니다. 성능 하락을 방지하기 위해서 iOS 10에서 Prefetching API가 도입되었습니다. 이 API는 가까운 시점에 표시될 셀을 백그라운드에서 미리 준비해 두는 방식으로 스크롤 성능을 향상 시킵니다. 하지만 포그라운드에서 셀을 로딩하면서 동시에 Prefetching API가 백그라운드에서 셀을 로딩하는 문제가 발견되었습니다. 이 경우 두 작업 모두 원래 필요한 시간보다 더 많은 시간동안 실행되고 스크롤 성능 역시 하락합니다. 백그라운드에서 로딩되는 셀은 당장 필요한 셀이 아니기 때문에 동시에 로딩할 필요가 없습니다. iOS 12는 Prefetch Serialization을 통해서 포그라운드에서 셀을 로딩한 후에 백그라운드에서 셀을 로딩합니다. 그래서 두 작업 모두 이전보다 빠르게 실행되고 스크롤 성능에 영향을 주지 않습니다.

Memory

iPhone X에서 374x250pt 이미지를 출력하려면 2.2MB 메모리가 필요합니다. 동일한 이미지를 그레이스케일로 출력하더라도 64bpp 이미지이기 때문에 여전히 2.2MB가 필요합니다. iOS 12부터는 모든 뷰에 Backing Store가 자동으로 추가됩니다. Backing Store는 뷰에 컨텐트를 출력하기 위해 필요한 Color Depth를 자동으로 인식합니다. 예를 들어, Core Graphics API로 그레이스케일 이미지를 그리면 Backing Store의 Color Depth가 8bpp로 설정됩니다. 그래서 257KB로 이미지를 출력할 수 있습니다.

Automatic Backing Store는 iOS 12 SDK로 빌드하면 자동으로 활성화 됩니다. 동일한 품질의 컨텐츠를 더 적은 메모리로 출력할 수 있기 때문에 전반적인 그리기 성능이 향상됩니다.

Auto Layout

알고리즘 개선으로 레이아웃 선능이 향상되었습니다. 이전 버전에서 시간 복잡도가 O(N)인 작업의 실행 속도가 개선되었습니다. O(logN) 또는 O(NlogN)인 작업들은 O(N)으로 개선되었습니다.

 

API Enhancements

Swiftification

UIKit은 Objective-C로 개발되었기 때문에 여전히 Swift와 어울리지 않는 부분이 존재합니다. 그래서 Swift Standard Library나 Swift에서 사용하는 패턴과 함께 사용할 때 어색한 부분이 많습니다. 이런 부분을 개선해서 좀 더 Swift에 어울리는 API를 제공합니다. API는 변경되었지만 Swift 3과 같은 Grand Renaming 지옥을 걱정할 필요는 없습니다.

UIKit에 선언되어 있는 열거형이나 옵션 구조체는 Global Name Space로 임포트 됩니다. UIApplicationState 열거형은 UIApplication 클래스와 연관된 형식이지만 별도의 enum으로 임포트 됩니다.

enum UIApplicationState : Int {
    case active
    case inactive
    case background
}

이런 방식으로 임포트 되는 형식들은 모두 연관된 형식의 Nested Type으로 변경되었습니다. 이제 UIApplicationState가 아니라 UIApplication.State 입니다.

extension UIApplication {
    enum State : Int {
        case active
        case inactive
        case background
    }
}

UIKit 프레임워크에 선언되어 있는 상수들은 초기에 Global Name Space로 임포트 되었습니다. 그 후 일부 상수들은 연관된 형식의 Nested Type으로 변경되었습니다. Swift 4.2부터는 이러한 상수들이 연관된 형식의 속성으로 임포트 됩니다.

// Swift 4
NSNotification.Name.UIApplicationDidChangeStatusBarOrientation
UIApplicationStatusBarOrientationUserInfoKey

// Swift 4.2
UIApplication.didChangeStatusBarOrientationNotification
UIApplication.statusBarOrientationUserInfoKey

전역 함수 역시 연관된 형식의 메소드로 대체되었습니다.

// Swift 4
let originalRect = CGRect(x: 0, y: 0, width: 100, height: 100)
let insets = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)
let insetRect = UIEdgeInsetsInsetRect(originalRect, insets)

let image = UIImage(named: "Apple")
let pngData = UIImagePNGRepresentation(image!)


// Swift 4.2
let originalRect = CGRect(x: 0, y: 0, width: 100, height: 100)
let insets = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)
let insetRect = originalRect.inset(by: insets)

let image = UIImage(named: "Apple")
let pngData = image?.pngData()

다양한 형식에 Codable 구현이 추가되었습니다. 이제 JSONEncoder와 JSONDecoder를 활용해서 인코딩과 디코딩을 쉽게 구현할 수 있습니다.

  • CGPoint
  • CGRect
  • CGSize
  • CGVector
  • CGAffineTransform
  • UIEdgeInsets
  • UIOffset
let encoded = try! JSONEncoder().encode(CGPoint(x: 0, y: 0))
let decoded = try! JSONDecoder().decode(CGPoint.self, from: encoded)

Notification

  • Custom Notification에서 터치 이벤트를 처리할 수 있게 되었습니다.
  • Notification Center 표시되는 노티피케이션이 앱을 기준으로 그룹핑 됩니다.
  • Thread Identifier를  활용해서 원하는 항목을 따로 그룹핑 할 수 있습니다.

Password AutoFill

  • 비밀번호 자동 생성 기능이 추가되었습니다.
  • 비밀번호 생성 조건을 지정할 수 있고, 계정 생성 화면에 통합할 수 있습니다.
  • Two-factor Authentication을 사용하는 경우 디바이스에 전달된 인증 코드를 자동으로 인식하고 Quick Type 목록에 표시합니다. 그래서 한 번의 탭으로 쉽게 입력할 수 있습니다.

 

Siri Shortcuts

iOS 12부터 앱이 제공하는 기능을 Siri를 통해 실행할 수 있습니다. 그리고 Coversheet와 Siri Watch Face를 통해서 사용자에게 특정 기능을 제안할 수 있습니다. 사용자가 직접 음성을 등록하고 기능을 실행하는 것도 가능합니다.

NSUserActivity를 활용해서 Handoff나 Spotlight 기능을 이미 구현해 두었다면 eligibleForPrediction 속성을 true로 설정하는 것만으로 Siri Shortcuts을 적용할 수 있습니다.

Siri Kit Intents API를 활용하면 조금 더 복잡한 Siri Shortcuts을 구현할 수 있습니다. 여기에는 다양한 기본 Intent가 정의되어 있습니다.

  • Car Commands
  • Notes
  • Messaging
  • Lists
  • VoIP Calling
  • Photo Search
  • Car Play
  • Workouts
  • Payments
  • Visual Codes
  • Ride Booking
  • Restaurant Reservations

iOS 12에서는 직접 Custom Intent를 추가할 수 있습니다. 사용자는 Custom Voice Shortcut을 생성하고 Intent와 연결할 수 있습니다. 그리고 생성된 Shortcut은 Shortcuts 앱을 통해서 관리할 수 있습니다. (Shortcuts 앱은 향후 AppStore를 통해 다운로드 할 수 있습니다.)

 

이 글은 WWDC18 Session 202 What’s New in Cocoa Touch를 요약한 글입니다. 글쓴이의 관심사가 아닌 일부 내용은 생략되어 있습니다.



댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

*