2016-01-26 32 views
0

內部數組我有一個UIPickerView我想填充值的數組。值的數組來自我的一個類中的函數(使用json獲取值然後將它們放入數組中)。數據正在成功抓取,並添加到函數內的數組中,但由於某種原因它不會返回。需要從一個函數返回我

這裏是我的類:

class Supplier { 

    var supplierId: Int 
    var supplierName: String 


    init(id: Int, name: String){ 
     supplierId = id 
     supplierName = name 
    } 

    static func arrayOfSupplierNames() -> [String] { 
     let urlString = Constants.Urls.Suppliers.List; 
     let session = NSURLSession.sharedSession(); 
     let url = NSURL(string: urlString)!; 
     var suppliers: Array<String> = [] 

     session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in 
      if let responseData = data { 

       do { 
        let json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! Dictionary<String, AnyObject>; 

        if let suppliersDictionary = json["suppliers"] as? [Dictionary<String, AnyObject>] { 

         for aSupplier in suppliersDictionary { 

          if let id = aSupplier["id"] as? Int, let name = aSupplier["supplierName"] as? String { 
           let supplier = Supplier(id: id, name: name) 
           suppliers.append(supplier.supplierName) 
          } 

         } 
        } 
       }catch { 
        print("Could not serialize"); 
       } 
      } 
      }.resume() 

     return suppliers 
    } 
} 

這似乎是工作,因爲當我調試,我可以看到被添加到陣列中的值。我在我的ViewController另一個函數運行該功能,並將其添加到本地陣列,但是從函數返回數組似乎並沒有被添加到視圖控制器的陣列:

func populateSuppliersArray() { 

     let sup:Array = Supplier.arrayOfSupplierNames() 

     for s in sup { 
      supplierArray.append(s) //supplierArray is at the top scope of view controller. 
     } 
    } 

我還送類函數是靜態的,所以我不必爲了使用函數而初始化類。我不確定這是否正確。當我在調試時查看sup變量時,它具有零值。

+1

你的函數返回一個空數組。 –

回答

1

在異步塊內接收json數據。只要您致電dataTaskWithURL上的resume,您的功能就會返回。您應該將完成塊作爲參數傳遞給arrayOfSupplierNames,然後將該數組傳遞給該完成塊。你可以修改你的函數是這樣的:

// take a completion block as an argument 
func arrayOfSupplierNames(completion: (([String]) -> Void)) -> Void { 
    let urlString = Constants.Urls.Suppliers.List; 
    let session = NSURLSession.sharedSession(); 
    let url = NSURL(string: urlString)!; 
    var suppliers: Array<String> = [] 

    session.dataTaskWithURL(url) { (data: NSData?, response:NSURLResponse?, error: NSError?) -> Void in 
     if let responseData = data { 

      do { 
       let json = try NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.AllowFragments) as! Dictionary<String, AnyObject>; 

       if let suppliersDictionary = json["suppliers"] as? [Dictionary<String, AnyObject>] { 

        for aSupplier in suppliersDictionary { 

         if let id = aSupplier["id"] as? Int, let name = aSupplier["supplierName"] as? String { 
          let supplier = Supplier(id: id, name: name) 
          suppliers.append(supplier.supplierName) 
         } 

        } 
        completion(suppliers) // pass the array to completion block 
       } 
      }catch { 
       print("Could not serialize"); 
      } 
     } 
     }.resume() 
} 

你會這樣稱呼它:

Supplier.arrayOfSupplierNames { (suppliers) -> Void in 
    // use suppliers as appropriate 
} 

請注意,完成塊的異步調用(一段時間以後)。因爲它包含的異步任務其完成處理填補了本地陣列* *後您的功能已經退出

+0

那麼當我從視圖控制器調用它時,我會傳入什麼函數?它期待一個參數:'let sup:Array = Supplier.arrayOfSupplierNames()' – drpcken

+1

你會通過它一個完成塊,我正在更新我的答案來添加它。 – ishaq

+0

我從來沒有使用完成塊,但聽說過它們。我有點困惑,但它似乎工作(除了我認爲我需要將我的viewDidLoad函數移動到其他地方,而不是填充選擇器)。所以基本上我將我空的Suppliers數組傳遞給我的視圖控制器中的函數,並且一旦回調在函數中完成,我將它填充並傳回給我的視圖控制器以使用它? – drpcken

相關問題