2017-06-12 14 views
0

メインモデルChatConversationModelの配列プロパティuserAcitivitiesChatUserAcitivityModelの配列です。私は、userAcitivitiesfriendIDが含まれているChatConversationModelオブジェクトをRealmから取得したいと考えています。私はいくつかの方法を試しましたが、私が結果を得ることができませんでした。私は次のことをやっているし、それは私のために働いている瞬間レルムスウィフト内のネストされた配列のオブジェクトをフィルタリングします

import Foundation 
import RealmSwift 
import ObjectMapper 

class ChatConversationModel: Object, Mappable { 

    dynamic var id = "" 
    dynamic var typeIndex = ChatTypes.ChatType.oneToOne.index 
    var userAcitivities = List<ChatUserAcitivityModel>() 

    override class func primaryKey() -> String? { 
     return "id" 
    } 

    convenience required init?(map: Map) { 
     self.init() 
    } 

    func mapping(map: Map) { 
     if map.mappingType == .fromJSON { 
      id <- map["id"] 
      typeIndex <- map["typeIndex"] 
      userAcitivities <- (map["userAcitivities"], ListTransform<ChatUserAcitivityModel>()) 
     } else { 
      id >>> map["id"] 
      typeIndex >>> map["typeIndex"] 
      userAcitivities >>> (map["userAcitivities"], ListTransform<ChatUserAcitivityModel>()) 
     } 
    } 

} 

import Foundation 
import RealmSwift 
import ObjectMapper 

class ChatUserAcitivityModel: Object, Mappable { 

    dynamic var userID = "" 
    /// This is necessary in order to know from what point to download the chat if the user deleted it. 
    /// If this property is 0.0, then there has never been a deletion. 
    dynamic var removedChatTimeStamp = 0.0 

    override class func primaryKey() -> String? { 
     return "userID" 
    } 

    convenience required init?(map: Map) { 
     self.init() 
    } 

    func mapping(map: Map) { 
     if map.mappingType == .fromJSON { 
      userID <- map["userID"] 
      removedChatTimeStamp <- map["removedChatTimeStamp"] 
     } else { 
      userID >>> map["userID"] 
      removedChatTimeStamp >>> map["removedChatTimeStamp"] 
     } 
    } 

} 

func getFriendChatConversationModel(_ friendID: String) { 
    let realm = try! Realm() 
    let chatConversationModels = realm.objects(ChatConversationModel.self).filter("typeIndex = %@", ChatTypes.ChatType.oneToOne.index) 
    let friend = chatConversationModels.filter { $0.userAcitivities.filter { $0.userID == friendID } } 
} 

が、私はこれを表現するための最良の方法を見つけるしたいと思います:

func getFriendChatConversationModel(_ friendID: String) -> ChatConversationModel? { 
    let realm = try! Realm() 
    let chatConversationModels = realm.objects(ChatConversationModel.self).filter("typeIndex = %@", ChatTypes.ChatType.oneToOne.index) 

    var friendChatConversationModel: ChatConversationModel? 

    for chatConversationModel in chatConversationModels { 
     if chatConversationModel.userAcitivities.contains(where: { (chatUserAcitivityModel) -> Bool in 
      chatUserAcitivityModel.userID == friendID 
     }) { 
      friendChatConversationModel = chatConversationModel 
      return friendChatConversationModel 
     } 
    } 
    return nil 
} 
+0

マイナーなスペルノート:クラスとプロパティの名前に「アクティビティ」と書かれている可能性があります。 – bdash

答えて

2

私が正しく理解していれば、私は思います

func getFriendChatConversationModel(_ friendID: String) -> ChatConversationModel? { 
    let realm = try! Realm() 
    let chatConversationModels = realm.objects(ChatConversationModel.self).filter("typeIndex = %@", ChatTypes.ChatType.oneToOne.index) 
    return chatConversationModels.filter("ANY userAcitivities.userID == %@", friendID).first 
} 
関連する問題