2016-08-21 112 views
1

我從解析後端獲取值並使用它們來創建數組,但是沒有任何數據存儲在其中。有人可以告訴我我做錯了什麼嗎?行:讓的DataEntry = ChartDataEntry(值:值[I],xIndex:ⅰ)還給 「索引超出範圍」不存儲值的數組

var fattyArray: [Double] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let innerQuery = PFUser.query() 
    innerQuery!.whereKey("objectId", equalTo: "VTieywDsZj") 
    let query = PFQuery(className: "BodyFat") 
    query.whereKey("UserID", matchesQuery: innerQuery!) 
    query.findObjectsInBackgroundWithBlock { 
     (percentages: [PFObject]?, error: NSError?) -> Void in 
     if error == nil { 
      print("Successful, \(percentages!.count) retrieved") 
      if let percentage = percentages as [PFObject]! { 
       for percentage in percentages! { 
        print(percentage["BodyFatPercentage"]) 
     self.fattyArray.append(percentage["BodyFatPercentage"].doubleValue) 
        print(self.fattyArray) 
       } 
      } 
     } else { 
      print("\(error?.userInfo)") 
     } 
    } 

    let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] 
    let unitsSold = fattyArray 

    setChart(months, values: unitsSold) 

} 

func setChart(dataPoints: [String], values: [Double]) { 

    var dataEntries: [ChartDataEntry] = [] 

    for i in 0..<dataPoints.count { 
     let dataEntry = ChartDataEntry(value: values[i], xIndex: i) 
     dataEntries.append(dataEntry) 
    } 

回答

1

有兩個問題這裏:

  1. 的一個問題findObjectsInBackgroundWithBlock是異步運行的,即fattyArray直到後面沒有附加值。您應該將調用setChart的代碼移入findObjectsInBackgroundWithBlock閉包。

    query.findObjectsInBackgroundWithBlock { percentages, error in 
        if error == nil { 
         // build your array like you did in your question 
    
         // but when done, call `setChart` here 
    
         let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] 
         let unitsSold = fattyArray 
    
         setChart(months, values: unitsSold) 
        } else { 
         print("\(error?.userInfo)") 
        } 
    } 
    
    // but not here 
    
    // let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] 
    // let unitsSold = fattyArray 
    // 
    // setChart(months, values: unitsSold) 
    
  2. setChart程序給你一個「索引超出範圍」,因爲您是通過迭代dataPoints,但values數組中查找值誤差。我在這裏看不到任何內容,以確保monthsfattyArray中的條目數相同。很顯然,如果你修正了第一點,你就有更好的機會運行它(因爲在數據被完全檢索之前你實際上不會生成圖表),但是我仍然沒有看到任何東西這裏保證findObjectsInBackgroundWithBlock將返回至少六個條目。

+0

Thanks Rob!那就是訣竅。事情是,雖然我想留下未來幾個月沒有價值作爲激勵繼續取得進展,並填補他們。有沒有辦法做到這一點或做ChartDataEntries必須是對? – Nick

+0

我想如果你的圖表入口點允許使用可選項(例如'nil'值),那麼你可以(a)從你的數據庫中檢索數據(大概是日期和值對),然後; (b)爲這些未來日期手動添加具有日期但沒有值的數據點。可能有很多不同的方式來處理這個問題,但從概念上來說,它似乎是可能的。但它似乎超出了這個問題的範圍... – Rob

+0

非常感謝您的幫助!所以我找到了另一個我搜索過的問題,發現了一條你曾經評論過的話題,並且想知道你是否不介意看看。我沒有50pt的聲望,所以我不能評論該線程(http://stackoverflow.com/a/28723081/5109162),但我確實在這裏開始另一個http://stackoverflow.com/questions/39137259/UITableView的 - 不使用小區用作爲發送器/ 39137309#39137309 – Nick