如何在NSUserDefault中排序NSMutableDictionary存储数组



我有一个NSMutableDictionary与NSUserDefault保存的数组,我想排序数组基于"时间戳"键(值是一个字符串)在每个NSMutableDictionary:我用来检索数组的代码:

     if let chatsArray = NSUserDefaults().arrayForKey("myChatsList") as? [NSMutableDictionary]{
            print(chatsArray)
            //sort the array
            print(sortedArray)
     }

这就是我的数组的样子:

[{
    eventBadge = 1;
    eventId = "-KWE39B6Dh7rDzaF-xy4";
    lastMessage = uyfgduihgvifudhviufhvdf;
    timestamp = 20;
    unreadMessage = 2;
}, {
    eventBadge = 1;
    eventId = "-KWWc99ex8f7ksq8TR2U";
    lastMessage = uyfgduihgvifudhviufhvdf;
    timestamp = 5;
    unreadMessage = 1;
}, {
    eventBadge = 1;
    eventId = "-KWE5OYRZnZ5-p3LUotL";
    lastMessage = uyfgduihgvifudhviufhvdf;
    timestamp = 10;
    unreadMessage = 2;
}]

我尝试使用NSSDescriptor:

var descriptor: NSSortDescriptor = NSSortDescriptor(key: "timestamp", ascending: true)
chatsArray.sortedArrayUsingDescriptors([descriptor])

和使用类型化数组(在使用新类之后)

mutableChatsArray.sortInPlace{ ($0.compare($1.timestamp) == NSComparisonResult.OrderedDescending)}

到目前为止没有成功……谢谢你的帮助

迅速3

例子
  let chatsArray = [[
        "eventBadge" : 1,
        "eventId" : "-KWE39B6Dh7rDzaF-xy4",
        "lastMessage" : "uyfgduihgvifudhviufhvdf",
        "timestamp" : 20,
        "unreadMessage" : 2,
        ], [
            "eventBadge" : 1,
            "eventId" : "-KWWc99ex8f7ksq8TR2U",
            "lastMessage" : "uyfgduihgvifudhviufhvdf",
            "timestamp" : 5,
            "unreadMessage" : 1,
        ], [
            "eventBadge" : 1,
            "eventId" : "-KWE5OYRZnZ5-p3LUotL",
            "lastMessage" : "uyfgduihgvifudhviufhvdf",
            "timestamp" : 10,
            "unreadMessage" : 2,
    ]] as [[String:Any]]
    // to get the timestamp value and store it inside an array with order
    let arrayTimeStamp = (chatsArray.flatMap{$0["timestamp"]} as! Array<Int>).sorted(by: >)
    print(arrayTimeStamp) // [20, 10, 5]
    //to order an array of dictionaries
    let TimeStamp = chatsArray.sorted{$0["timestamp"] as! Int > $1["timestamp"] as! Int }
    print(TimeStamp)
//[["eventId": "-KWE39B6Dh7rDzaF-xy4", "lastMessage":"uyfgduihgvifudhviufhvdf", "timestamp": 20, "unreadMessage": 2, "eventBadge": 1],
//["eventId": "-KWE5OYRZnZ5-p3LUotL", "lastMessage": "uyfgduihgvifudhviufhvdf", "timestamp": 10, "unreadMessage": 2, "eventBadge": 1],
//["eventId": "-KWWc99ex8f7ksq8TR2U", "lastMessage": "uyfgduihgvifudhviufhvdf", "timestamp": 5, "unreadMessage": 1, "eventBadge": 1]]

使用NSUserDefaults是非常烦人的。在从默认值获取和设置数据时,我通常使用这种技术。

var mutableArray = defaults.objectForKey("Your Array") as? NSMutableArray mutableArray.sortInPlace { (a, b) -> Bool in a.start!.compare(b.start!) == NSComparisonResult.OrderedAscending } defaults.setValue(mutableArray forKey: "Your Array")

@Rob和@Fallah,感谢你们的回答,我会检查他们,现在我通过使用NNSSDescriptor并添加一个选择器来解决我的问题:

let descriptor: NSSortDescriptor = NSSortDescriptor(key: "timestamp", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))
            let sortedChatsArray = (chatsArray as NSArray).sortedArrayUsingDescriptors([descriptor]) 

最新更新