diff --git a/Podfile b/Podfile index aeefbb26..4e3a5132 100644 --- a/Podfile +++ b/Podfile @@ -5,4 +5,4 @@ use_frameworks! pod 'pop' pod 'AFNetworking' pod 'MZFayeClient', :path => '../CatchLib-iOS/MZFayeClient/' -pod 'Realm' +pod 'RealmSwift' diff --git a/Podfile.lock b/Podfile.lock index c87567c4..10d9e668 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -25,16 +25,18 @@ PODS: - Base64 (~> 1.0.1) - SocketRocket (~> 0.3.1-beta2) - pop (1.0.7) - - Realm (0.91.5): - - Realm/Headers (= 0.91.5) - - Realm/Headers (0.91.5) + - Realm (0.92.1): + - Realm/Headers (= 0.92.1) + - Realm/Headers (0.92.1) + - RealmSwift (0.92.1): + - Realm (= 0.92.1) - SocketRocket (0.3.1-beta2) DEPENDENCIES: - AFNetworking - MZFayeClient (from `../CatchLib-iOS/MZFayeClient/`) - pop - - Realm + - RealmSwift EXTERNAL SOURCES: MZFayeClient: @@ -45,7 +47,8 @@ SPEC CHECKSUMS: Base64: 4924bf3ca6fa559a5161ef717291bd450eb7bd1a MZFayeClient: 19df756a4c86c8f414668e6edc54fccfee54adbb pop: 628ffc631644601567ee8bfaaaea493ebd7d0923 - Realm: 670059efdb212ab939c1745a60aff27820c0a9c4 + Realm: 10c91667c5c65d6fe56b206c2c31e9b5eafb8718 + RealmSwift: edc7963f64c50852992751ba274ee506a0d104b2 SocketRocket: 7284ab9370a06c99aba92b2fe3a32aedd0f9a6fa COCOAPODS: 0.37.0 diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index a1ea9ebb..06b14cb3 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -150,7 +150,6 @@ 50CDBE4A1ACBAD3200459CE0 /* ChatLeftImageCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50CDBE481ACBAD3200459CE0 /* ChatLeftImageCell.xib */; }; 50D4D0DB1AFA825B005AEB6F /* MediaControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D4D0DA1AFA825B005AEB6F /* MediaControlView.swift */; }; 50E114F41ABBF9CC00F13000 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114F31ABBF9CC00F13000 /* Models.swift */; }; - 50E114F71ABBFA7000F13000 /* RLMSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114F61ABBFA7000F13000 /* RLMSupport.swift */; }; 50E114F91ABC137A00F13000 /* YepServiceSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114F81ABC137A00F13000 /* YepServiceSync.swift */; }; 50E114FC1ABC549300F13000 /* ContactsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114FA1ABC549300F13000 /* ContactsCell.swift */; }; 50E114FD1ABC549300F13000 /* ContactsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50E114FB1ABC549300F13000 /* ContactsCell.xib */; }; @@ -326,7 +325,6 @@ 50CDBE481ACBAD3200459CE0 /* ChatLeftImageCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = ChatLeftImageCell.xib; path = Views/Cells/ChatLeftImage/ChatLeftImageCell.xib; sourceTree = ""; }; 50D4D0DA1AFA825B005AEB6F /* MediaControlView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MediaControlView.swift; path = Views/Media/MediaControlView.swift; sourceTree = ""; }; 50E114F31ABBF9CC00F13000 /* Models.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Models.swift; path = Realm/Models.swift; sourceTree = ""; }; - 50E114F61ABBFA7000F13000 /* RLMSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RLMSupport.swift; path = Realm/RLMSupport.swift; sourceTree = ""; }; 50E114F81ABC137A00F13000 /* YepServiceSync.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepServiceSync.swift; path = Services/YepServiceSync.swift; sourceTree = ""; }; 50E114FA1ABC549300F13000 /* ContactsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ContactsCell.swift; path = Views/Cells/Contacts/ContactsCell.swift; sourceTree = ""; }; 50E114FB1ABC549300F13000 /* ContactsCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = ContactsCell.xib; path = Views/Cells/Contacts/ContactsCell.xib; sourceTree = ""; }; @@ -1064,7 +1062,6 @@ 50E114F51ABBF9D100F13000 /* Realm */ = { isa = PBXGroup; children = ( - 50E114F61ABBFA7000F13000 /* RLMSupport.swift */, 50E114F31ABBF9CC00F13000 /* Models.swift */, ); name = Realm; @@ -1410,7 +1407,6 @@ 508D17401ACCD2740092D666 /* YepButton.swift in Sources */, 506BB7F51AE4E0A500C1A2A0 /* SkillAnnotationHeader.swift in Sources */, 5023DE301AB6861500B3EE96 /* ProfileViewController.swift in Sources */, - 50E114F71ABBFA7000F13000 /* RLMSupport.swift in Sources */, 5023DE261AB6856300B3EE96 /* ConversationsViewController.swift in Sources */, 50A9D4511ACD383E000B2599 /* NSDate+Extension.swift in Sources */, 506EC20A1AC95BFC00CE42B3 /* UIFont+Yep.swift in Sources */, diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 73c13f4a..3cd71a4e 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -6,7 +6,7 @@ // Copyright (c) 2015年 Catch Inc. All rights reserved. // -import Realm +import RealmSwift // 总是在这个队列里使用 Realm @@ -24,27 +24,27 @@ enum UserFriendState: Int { case Me = 4 // 自己 } -class Avatar: RLMObject { +class Avatar: Object { dynamic var avatarURLString: String = "" dynamic var avatarFileName: String = "" var user: User? { - let users = linkingObjectsOfClass("User", forProperty: "avatar") as! [User] + let users = linkingObjects(User.self, forProperty: "avatar") return users.first } } -class UserSkillCategory: RLMObject { +class UserSkillCategory: Object { dynamic var skillCategoryID: String = "" dynamic var name: String = "" dynamic var localName: String = "" var skills: [UserSkill] { - return linkingObjectsOfClass("UserSkill", forProperty: "category") as! [UserSkill] + return linkingObjects(UserSkill.self, forProperty: "category") } } -class UserSkill: RLMObject { +class UserSkill: Object { dynamic var category: UserSkillCategory? @@ -54,15 +54,15 @@ class UserSkill: RLMObject { dynamic var coverURLString: String = "" var learningUsers: [User] { - return linkingObjectsOfClass("User", forProperty: "learningSkills") as! [User] + return linkingObjects(User.self, forProperty: "learningSkills") } var masterUsers: [User] { - return linkingObjectsOfClass("User", forProperty: "masterSkills") as! [User] + return linkingObjects(User.self, forProperty: "masterSkills") } } -class User: RLMObject { +class User: Object { dynamic var userID: String = "" dynamic var nickname: String = "" dynamic var introduction: String = "" @@ -80,47 +80,47 @@ class User: RLMObject { dynamic var longitude: Double = 0 dynamic var latitude: Double = 0 - dynamic var learningSkills = RLMArray(objectClassName: UserSkill.className()) - dynamic var masterSkills = RLMArray(objectClassName: UserSkill.className()) + dynamic var learningSkills = List() + dynamic var masterSkills = List() var messages: [Message] { - return linkingObjectsOfClass("Message", forProperty: "fromFriend") as! [Message] + return linkingObjects(Message.self, forProperty: "fromFriend") } var conversation: Conversation? { - let conversations = linkingObjectsOfClass("Conversation", forProperty: "withFriend") as! [Conversation] + let conversations = linkingObjects(Conversation.self, forProperty: "withFriend") return conversations.first } var ownedGroups: [Group] { - return linkingObjectsOfClass("Group", forProperty: "owner") as! [Group] + return linkingObjects(Group.self, forProperty: "owner") } var belongsToGroups: [Group] { - return linkingObjectsOfClass("Group", forProperty: "members") as! [Group] + return linkingObjects(Group.self, forProperty: "members") } } // MARK: Group -class Group: RLMObject { +class Group: Object { dynamic var groupID: String = "" dynamic var groupName: String = "" dynamic var createdAt: NSDate = NSDate() dynamic var owner: User? - dynamic var members = RLMArray(objectClassName: User.className()) + dynamic var members = List() var conversation: Conversation? { - let conversations = linkingObjectsOfClass("Conversation", forProperty: "withGroup") as! [Conversation] + let conversations = linkingObjects(Conversation.self, forProperty: "withGroup") return conversations.first } } // MARK: Message -class Coordinate: RLMObject { +class Coordinate: Object { dynamic var latitude: Double = 0 dynamic var longitude: Double = 0 } @@ -181,7 +181,7 @@ enum MessageSendState: Int { case Successed = 2 } -class Message: RLMObject { +class Message: Object { dynamic var messageID: String = "" dynamic var createdAt: NSDate = NSDate() @@ -211,7 +211,7 @@ enum ConversationType: Int { case Group = 1 // 群组对话 } -class Conversation: RLMObject { +class Conversation: Object { dynamic var type: Int = ConversationType.OneToOne.rawValue dynamic var updatedAt: NSDate = NSDate() @@ -219,7 +219,7 @@ class Conversation: RLMObject { dynamic var withGroup: Group? var messages: [Message] { - return linkingObjectsOfClass("Message", forProperty: "conversation") as! [Message] + return linkingObjects(Message.self, forProperty: "conversation") } } @@ -227,34 +227,40 @@ class Conversation: RLMObject { // MARK: Helpers -func normalUsers() -> RLMResults { +func normalUsers() -> Results { + let realm = Realm() let predicate = NSPredicate(format: "friendState = %d", UserFriendState.Normal.rawValue) - return User.objectsWithPredicate(predicate) + return realm.objects(User).filter(predicate) } func userSkillWithSkillID(skillID: String) -> UserSkill? { + let realm = Realm() let predicate = NSPredicate(format: "skillID = %@", skillID) - return UserSkill.objectsWithPredicate(predicate).firstObject() as? UserSkill + return realm.objects(UserSkill).filter(predicate).first } func userSkillCategoryWithSkillCategoryID(skillCategoryID: String) -> UserSkillCategory? { + let realm = Realm() let predicate = NSPredicate(format: "skillCategoryID = %@", skillCategoryID) - return UserSkillCategory.objectsWithPredicate(predicate).firstObject() as? UserSkillCategory + return realm.objects(UserSkillCategory).filter(predicate).first } func userWithUserID(userID: String) -> User? { + let realm = Realm() let predicate = NSPredicate(format: "userID = %@", userID) - return User.objectsWithPredicate(predicate).firstObject() as? User + return realm.objects(User).filter(predicate).first } func groupWithGroupID(groupID: String) -> Group? { + let realm = Realm() let predicate = NSPredicate(format: "groupID = %@", groupID) - return Group.objectsWithPredicate(predicate).firstObject() as? Group + return realm.objects(Group).filter(predicate).first } func avatarWithAvatarURLString(avatarURLString: String) -> Avatar? { + let realm = Realm() let predicate = NSPredicate(format: "avatarURLString = %@", avatarURLString) - return Avatar.objectsWithPredicate(predicate).firstObject() as? Avatar + return realm.objects(Avatar).filter(predicate).first } func tryGetOrCreateMe() -> User? { @@ -263,9 +269,9 @@ func tryGetOrCreateMe() -> User? { return me } else { - let realm = RLMRealm.defaultRealm() + let realm = Realm() - realm.beginWriteTransaction() + realm.beginWrite() let me = User() @@ -280,9 +286,9 @@ func tryGetOrCreateMe() -> User? { me.avatarURLString = avatarURLString } - realm.addObject(me) + realm.add(me) - realm.commitWriteTransaction() + realm.commitWrite() return me } @@ -291,26 +297,26 @@ func tryGetOrCreateMe() -> User? { return nil } -func messagesInConversation(conversation: Conversation) -> RLMResults { +func messagesInConversation(conversation: Conversation) -> Results { + let realm = Realm() let predicate = NSPredicate(format: "conversation = %@", conversation) - let messages = Message.objectsWithPredicate(predicate).sortedResultsUsingProperty("createdAt", ascending: true) + let messages = realm.objects(Message).sorted("createdAtc", ascending: true) return messages } func tryCreateSectionDateMessageInConversation(conversation: Conversation, beforeMessage message: Message, success: (Message) -> Void) { let messages = messagesInConversation(conversation) if messages.count > 1 { - if let prevMessage = messages.objectAtIndex(messages.count - 2) as? Message { - if message.createdAt.timeIntervalSinceDate(prevMessage.createdAt) > 30 { // TODO: Time Section + let prevMessage = messages[messages.count - 2] + if message.createdAt.timeIntervalSinceDate(prevMessage.createdAt) > 30 { // TODO: Time Section - // insert a new SectionDate Message - let newSectionDateMessage = Message() - newSectionDateMessage.conversation = conversation - newSectionDateMessage.mediaType = MessageMediaType.SectionDate.rawValue - newSectionDateMessage.createdAt = message.createdAt.dateByAddingTimeInterval(-1) // 比新消息早一秒 + // insert a new SectionDate Message + let newSectionDateMessage = Message() + newSectionDateMessage.conversation = conversation + newSectionDateMessage.mediaType = MessageMediaType.SectionDate.rawValue + newSectionDateMessage.createdAt = message.createdAt.dateByAddingTimeInterval(-1) // 比新消息早一秒 - success(newSectionDateMessage) - } + success(newSectionDateMessage) } } } @@ -333,18 +339,14 @@ func nameOfConversation(conversation: Conversation) -> String? { func lastChatDateOfConversation(conversation: Conversation) -> NSDate? { let messages = messagesInConversation(conversation) - if let lastMessage = messages.lastObject() as? Message { - return lastMessage.createdAt - } - - return nil + return messages.last?.createdAt } func lastSignDateOfConversation(conversation: Conversation) -> NSDate? { let messages = messagesInConversation(conversation) if let - lastMessage = messages.lastObject() as? Message, + lastMessage = messages.last, user = lastMessage.fromFriend { return user.lastSignInAt } diff --git a/Yep/Realm/RLMSupport.swift b/Yep/Realm/RLMSupport.swift deleted file mode 100644 index 21845692..00000000 --- a/Yep/Realm/RLMSupport.swift +++ /dev/null @@ -1,78 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2014 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -import Realm - -extension RLMObject { - // Swift query convenience functions - public class func objectsWhere(predicateFormat: String, _ args: CVarArgType...) -> RLMResults { - return objectsWithPredicate(NSPredicate(format: predicateFormat, arguments: getVaList(args))) - } - - public class func objectsInRealm(realm: RLMRealm, _ predicateFormat: String, _ args: CVarArgType...) -> RLMResults { - return objectsInRealm(realm, withPredicate:NSPredicate(format: predicateFormat, arguments: getVaList(args))) - } -} - -extension RLMArray: SequenceType { - // Support Sequence-style enumeration - public func generate() -> GeneratorOf { - var i: UInt = 0 - - return GeneratorOf { - if (i >= self.count) { - return .None - } else { - return self[i++] as? RLMObject - } - } - } - - // Swift query convenience functions - public func indexOfObjectWhere(predicateFormat: String, _ args: CVarArgType...) -> UInt { - return indexOfObjectWithPredicate(NSPredicate(format: predicateFormat, arguments: getVaList(args))) - } - - public func objectsWhere(predicateFormat: String, _ args: CVarArgType...) -> RLMResults { - return objectsWithPredicate(NSPredicate(format: predicateFormat, arguments: getVaList(args))) - } -} - -extension RLMResults: SequenceType { - // Support Sequence-style enumeration - public func generate() -> GeneratorOf { - var i: UInt = 0 - - return GeneratorOf { - if (i >= self.count) { - return .None - } else { - return self[i++] as? RLMObject - } - } - } - - // Swift query convenience functions - public func indexOfObjectWhere(predicateFormat: String, _ args: CVarArgType...) -> UInt { - return indexOfObjectWithPredicate(NSPredicate(format: predicateFormat, arguments: getVaList(args))) - } - - public func objectsWhere(predicateFormat: String, _ args: CVarArgType...) -> RLMResults { - return objectsWithPredicate(NSPredicate(format: predicateFormat, arguments: getVaList(args))) - } -}