2017-06-12 2 views
0

Ich habe das Hauptmodell von ChatConversationModel, die eine Array-Eigenschaft userAcitivities hat, die ein Array von ChatUserAcitivityModel Objekte ist. Ich möchte von Realm das ChatConversationModel Objekt bekommen, in dem die userAcitivities das gegebene friendID enthält. Ich habe ein paar verschiedene Möglichkeiten ausprobiert, aber ich konnte das Ergebnis nicht erreichen.Filter ein Objekt auf einem verschachtelten Array in Realm Swift

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 } } 
} 

Im Moment für mich das folgende ich tue, und es funktioniert, aber ich möchte den besten Weg finden, diese auszudrücken:

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

Eine kleine Rechtschreibprüfung: 'Activity' sollte wahrscheinlich' Activity' in Ihren Klassen- und Eigenschaftsnamen geschrieben werden. – bdash

Antwort

2

Wenn ich richtig verstehe, ich glaube, Eine Abfrage wie diese wird tun, was Sie wollen:

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 
} 
Verwandte Themen