2017-06-12 28 views
2

我有一个包含数据的数组,当通过firebase进行读取时,有时候数据会随着时间的推移而以适当的顺序随机进入。所以,需要使用排序方法在swift中使用Firebase SDK从snapshot.value获取字典排序数组3.1

Repsonse从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]] 
+1

您的JSON是不正确的格式,你可以共享有效的JSON还有你试过的代码 –

+0

我编辑了我的问题。 –

+0

键'Images'的值是一个字典。字典根据定义是无序的。 – vadian

回答

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如,

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]] 
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) 
} 
0

Images键的关联值是字典不是数组和字典无法排序本身。你有一些选择,包括:

  1. 如果密钥("-KmRCabAyzoVNMD06Hpr")无关紧要,你再转换你的词典到一个数组,然后排序该数组。你可以在这个问题中使用你的比较函数。
  2. 进行键的集合并根据它们引用的字典中的UploadTime键值进行排序。

(2)听起来很复杂,但你有你的问题需要的部件和随后的评论:

但我们可以排序的字典,如:让又如sortedKeys =阵列(dictionary.keys).sorted (<)

这不排序字典,它排序字典的键。但你不希望通过自己的价值观,但根据他们指的什么键进行排序 - 元素的字典 - 你就沿着这些线路写了一个功能,你只需要结合两种:

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