Realm Objective-C & Swift 0.96
이번 버전(0.96) 에서 읽거나 쓴 Realm 파일은 이전 버전에서 열 수 없습니다. 기존 앱에 업데이트를 적용하실 경우에 특히 주의하시길 바랍니다.
Realm Objective-C 및 Realm Swift 0.96.0을 출시했습니다.
이 버전에서는 NULL 속성을 지원하고, keypath collection 쿼리 (count/min/max/sum/avg), Swift에서 RealmCollectionType
프로토콜 도입, 오류 헨들링의 개선과 버그 수정이 포함되었습니다.
Null 지원
이번 버전은 모든 속성 유형에 대해 NULL 값을 저장할 수 있게 되었습니다.
Objective-C
NSString *
, NSDate *
, NSData *
은 기본적으로 nil
을 할당이 가능합니다. 만약 nil
할당을 하지 않는 경우에는 모델에서 +requiredProperties
클래스 메서드를 재정의하고 nil
할당을 하지 않는 속성의 이름을 반환합니다. 이전 버전에서 작성된 파일에 접근 할 때 +requiredProperties
에서 지정한 속성 이외에는 자동으로 nil
사용 가능으로 변환됩니다.
Optional 숫자들은 숫자 타입인 NSNumber *
프로퍼티를 사용하여 저장이 가능합니다. NSNumber<RLMInt> *
, NSNumber<RLMBool> *
, NSNumber<RLMFloat> *
, 그리고 NSNumber<RLMDouble> *
도 사용 가능합니다.
(예시)
@interface OptionalTypes : RLMObject
@property NSString *optionalString;
@property NSString *requiredString;
@property NSData *optionalData;
@property NSDate *optionalDate;
@property NSNumber<RLMInt> *optionalInt;
@property NSNumber<RLMBool> *optionalBool;
@property NSNumber<RLMFloat> *optionalFloat;
@property NSNumber<RLMDouble> *optionalDouble;
@end
@implementation OptionalTypes
+ (NSArray *)requiredProperties {
return @[@"requiredString"];
}
@end
Swift
String
, NSDate
, NSData
속성들은 마찬가지로 optional 또는 non-optional 중 하나를 지정할 수 있습니다. 유감스럽게도 optional 숫자 타입을 직접적으로 지원하지는 않습니다.(참고. #2147) 따라서 수치 형을 nil
처리를 하려면, RealmOptional
으로 감싸야 할 것입니다.
(예시)
class OptionalTypes: Object {
dynamic var string: String? = "B"
dynamic var data: NSData? = "C".dataUsingEncoding(NSUTF8StringEncoding)
dynamic var date: NSDate? = NSDate(timeIntervalSince1970: 10)
let int = RealmOptional<Int>(1)
let float = RealmOptional<Float>(2.2)
let double = RealmOptional<Double>(3.3)
let bool = RealmOptional<Bool>(true)
let boolWithNilDefault = RealmOptional<Bool>(nil)
}
List 속성과 마찬가지로 RealmOptional
속성은 let
으로 선언해야하며, dynamic
으로는 안됩니다. RealmOptional
으로 감싼 실제 값을 읽거나 쓰려면 value
속성을 사용해야합니다.
파일 포맷 자동 변환
Realm 파일을 이번 버전에서 열면, 읽기 트렌젝션에 접근을 할 때 자동으로 새로운 파일 형식으로 변환이 됩니다. 이 자동 변환 작업은 다음과 같이 수행합니다.
- 모든 인데스가 다시 만들어집니다. (Int와 String 타입에만 적용이 됩니다.)
- 모든
NSString
,NSDate
,NSData
타입의 속성은+requiredProperties
을 지정하지 않으면 NULL 사용이 가능으로 변환됩니다. - 새로운 포맷의 버전 번호가 파일에 기록이 됩니다.
이 변환은 파일 쓰기를 필요로 하기 때문에 이전 버전의 Realm에서 작성된 파일은 새 버전에서 로드 할 수는 없습니다. 만약에 앱에서 Realm 파일을 묶는다면, 새로운 파일 포맷으로 업데이트 하여 교체해야합니다.
주의 : 이 파일 포맷 변환은 취소 할 수 없습니다.
Keypath Collection Queries
@count
, @min
, @max
, @sum
, @avg
을 사용하는 Keypath Collection 쿼리는 RLMArray
/List
속성들을 이제 지원합니다. 자세한 사용법은 Realm 웹 사이트에서 공개하고 있는 NSPredicate Cheatsheet를 참고하세요.
RealmCollectionType
Realm Objective-C는 오랫동안 공통 프로토콜 (RLMCollection
)을 사용하는 RLMArray
과 RLMResults
을 사용할 수 있었습니다. 이번 버전에서는 Swift에서도 같은 기능을 사용할 수 있도록 확장되었습니다.
List
와 Results
클래스는 모두 RealmCollectionType
프로토콜을 준수하도록 선언되어 있습니다. type-erased wrapper가 제공되고 있기 때문에 Swift에도 다른 레이아웃의 것을 같은 컬렉션에 포함 할 수 있습니다.
(예시)
class ViewController: UIViewController {
var collection: AnyRealmCollection
init(collection: RealmCollectionType) {
super.init()
self.collection = AnyRealmCollection(collection)
}
}
오류 처리 (Error Handling) 개선
현재 Realm 버전에서는 트랜잭션을 커밋할 때 디스크 잔여 용량이 부족한 경우 크래쉬가 발생할 수 있습니다. 다행하게도 Realm 크래쉬는 기존 데이터가 손상되는 것을 막았지만, 틀림없이 견고한 UX는 아니었습니다.
이제는 commitWrite
/ commitWriteTransaction
and write
/ transactionWithBlock
은 디스크 공간이 부족한 경우에는 오류를 반환합니다.
작은 개선 (Minor Enhancements)
-
RLMRealm
/Realm
에 하나의 객체가 저장되어 있는지 확인하는isEmpty
속성을 추가했습니다.
버그 수정
- 8MB 이상 16MB 이하의 크기의 NSData를 저장했을 때 실패하는 것을 수정했습니다.
-
RLMArray
/List
또는 관계 객체가 제거된 마이그레이션을 롤백할 때 실패하는 것을 수정했습니다. - 파일 열기에 실패했을 때 오류 객체에 경로 정보를 포함하도록 했습니다.
- 클래스의 subset을 사용하는 첫 번째 Realm을 열은 후 Realm이 열리지 않는 버그를 수정했습니다.
-
Object(value: ...)
이Object
서브 클래스 속성의 디폴트 값을 초기화 할 때 발생하는 버그를 수정했습니다. - 클래스의 하위 클래스의 부분 집합의 일부가 아닌 배열이나 객체 속성들을 가지는 경우 예외를 발생시킵니다.
- 여러 스레드에서 단시간에 여러번 같은 Realm 파일을 열 때 충돌이 발생하는 것을 수정했습니다.
- 몇 가지 오류 메시지에서 잘못된 함수 이름을 표시하던 문제를 수정했습니다.
읽어 주셔서 감사합니다. 지금 당장 Realm으로 놀라운 앱을 만들어보세요! 항상 우리는 주변인 StackOverflow, GitHub, 또는 Facebook Realm 사용자 그룹에 있습니다.