使用swift 3.1中的Firebase SDK对snapshot.value中的Dictionary字典进行排序

时间:2017-06-12 12:51:56

标签: ios swift3

我有一个包含数据的数组,因为在通过firebase获取时,有时数据会以适当的顺序排列,而有些时间是随机的。因此,需要使用排序方法对本地数组进行排序

来自snapshot.value的反响:

    Optional({
    Images =     {
        "-KmRCabAyzoVNMD06Hpr" =         {
            UploadTime = 1497269431993;
            imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962226641.jpg?alt=media&token=645878ac-1124-44b0-8203-75e94813ca76";
        };
        "-KmRCnYSsjJaZ3RINRDG" =         {
            UploadTime = 1497269484338;
            imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962275721.jpg?alt=media&token=d0113b12-531c-48a5-838b-02f96396a6df";
        };
        "-KmRCweslwMPBt0aCBIc" =         {
            UploadTime = 1497269521676;
            imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962317708.jpg?alt=media&token=e931d9b3-5635-4e2f-a597-2c60aa25b38d";
        };
        "-KmRD13t3pI21ci45LEv" =         {
            UploadTime = 1497269544342;
            imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962340349.jpg?alt=media&token=a738df76-e00b-48c2-9983-1e902e285a5f";
        };
        "-KmRD6WfaNTgKaVhy_Iq" =         {
            UploadTime = 1497269566141;
            imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962359997.jpg?alt=media&token=5828ee44-1721-4267-99d7-91f10381aa13";
        };
        "-KmREsVwMb4sY6yN4pNK" =         {
            UploadTime = 1497270028928;
            imageUrl = "https://firebasestorage.googleapis.com/v0/b/mychat-1147d.appspot.com/o/Images%2FwRHmnmfu3CeqXa77YgHEWVXI1AI3%2F518962824146.jpg?alt=media&token=aa0383c7-7d26-4b7a-b9bb-dbb1da3cdfff";
        };
    };
    UserInfo =     {
        UserID = wRHmnmfu3CeqXa77YgHEWVXI1AI3;
        userName = "Aric D'sooza";
    };
   })

我需要根据UploadTime对此数组进行排序。

我试过这个:

let sortedArray = (myArray ).sorted(by: { (dictOne, dictTwo) -> Bool in
        let d1 = dictOne["UploadTime"]! as! Double
        let d2 = dictTwo["UploadTime"]! as! Double

        return d1 < d2
    })
    print("Sorted Array - %@",sortedArray)
}

并尝试过:

self.sortedArray = (myArray as NSArray).sortedArray(using: [NSSortDescriptor(key: "UploadTime", ascending: true)]) as! [[String:AnyObject]]

3 个答案:

答案 0 :(得分:1)

尝试以下代码:

var localArray : [[String : AnyObject]] = [[:]]

for dic in myArray{
localArray.append(dic)
}

let sortedArray = (localArray ).sorted(by: { (dictOne, dictTwo) -> Bool in
        let d1 = dictOne["UploadTime"]! as! Double
        let d2 = dictTwo["UploadTime"]! as! Double

        return d1 < d2
    })
    print("Sorted Array - %@",sortedArray)
}

答案 1 :(得分:1)

试试这段代码,它对我有用。

 func sortDictonary(aDataDict:[String:AnyObject]) ->[[String:Any]] {

        let allKeys = Array(aDataDict.keys)
        var arrImages = [[String:Any]] ()
        for key in allKeys{
            var aDict = aDataDict[key] as! [String:AnyObject]    
            let aTempData = ["uploadTime" :aDict["UploadTime"] as! Double,
                                 "imageUrl":aDict["imageUrl"] as! String,
                                 "AutoId": key] as [String : AnyObject]
                // Here AutoID is unique key from your Response e.g. -KmREsVwMb4sY6yN4pNK
                arrImages.append(aTempData)
        }
        return arrImages
    }

调用此函数并将Images Dictionary as,

传递给您
var aDataDict = yourJSONResponse as! Dictionary<String,AnyObject>
var aDictUserInfo = aDataDict["UserInfo"] as!Dictionary<String,AnyObject>
let aDictImages = aDataDict["Images"] as! Dictionary<String,AnyObject>
let arrTempImages :[[String:Any]]  = self.sortDictonary(aDataDict: aDictImages)

您将获得排序数组,

arrImagesData = (arrImagesData as NSArray).sortedArray(using: [NSSortDescriptor(key: "uploadTime", ascending: true)]) as! [[String:AnyObject]]

答案 2 :(得分:0)

您的Images密钥的关联值是字典而非数组,字典本身无法排序。你有一些选择,包括:

  1. 如果键("-KmRCabAyzoVNMD06Hpr")对您不重要,则将字典转换为数组,然后对该数组进行排序。您可以使用问题中的比较函数。
  2. 创建密钥集合,并根据他们引用的字典中的UploadTime密钥值对其进行排序。
  3. (2)可能听起来很复杂但你在问题和随后的评论中都有你需要的部分:

      

    但是我们可以对字典进行排序:let sortedKeys = Array(dictionary.keys).sorted(&lt;)

    这不会对字典进行排序,它会对字典的键进行排序。但是你不希望按照它们的值对键进行排序,而是根据它们所指的 - 元素词典 - 你已经按照这些行编写了一个函数,你只需要将它们结合起来:

    let orderedKeys = Images.keys.sorted(by: { (keyOne, keyTwo) -> Bool in
       let d1 = Images[keyOne]!["UploadTime"] as! Int
       let d2 = Images[keyTwo]!["UploadTime"] as! Int
       return d1 < d2
    })
    

    这会获取键(keyOne),获取他们引用的词典(Images[keyOne]!),以及您想要排序的词典中的值(["UploadTime"] as! Int [我的测试数据包含整数] ),并对它们进行比较。

    请注意,原始字典Images根本没有排序;相反,你有一个集合orderedKeys,它包含你想要处理字典中的值的顺序的键。要获得排序中的第一个元素,请使用orderedKeys中的第一个键并使用它来索引Images

    您可以使用orderedKeys制作数组,或者只打印出值以便了解其工作情况:

    for key in orderedKeys
    {
       print(Images[key] ?? "should never occur")
    }
    

    HTH