2017-06-12 30 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