2015-10-10 56 views
1

我有這樣的代碼,它顯然錯誤了,因爲當我在返回語句中使用FOO時,它超出了函數的範圍。我知道(我想我知道)我需要使用閉包來捕獲變量,但我無法弄清楚如何做到這一點。使用Alamofire & SwiftyJSON。任何幫助將是偉大的!謝謝!使用Swift閉包捕獲變量

func getPlayerID(named: String) -> String { 

    Alamofire.request(.GET, "URL", headers: headers) 
     .responseJSON { response in 


     let json = JSON.self(response.result.value!) 

     for var index = 0; index < json.count; index++ { 
      if json[index]["Name"].stringValue == named { 
       var FOO = json[index]["FOO"].stringValue 
      } // If Statement End 
     } // For Loop End 
    } // Alamofire Request End 

    // Return Statement for getPLayerID Function 

     return FOO 

} // getPlayerID Function End 
} // Player Struct End 
+0

你可以在循環之外聲明'FOO'。 – Arc676

+0

如果我這樣做,在循環內更改了FOO的值,但該值並不遵循循環外的FOO。希望這是有道理的。用print()聲明測試了這個 –

回答

1

的基本思路是,getPlayerID不應該返回任何東西,而是應該只是有一個參數,它是一個封閉的,一旦你檢索值要「回報」,您使用該值調用關閉作爲參數。

但是,我在這裏建議其他各種改進的:

  • 構建一個字符串數組並返回
  • 檢查是否result.Failure因爲你無法控制什麼各種服務器/網絡可能會出現問題
  • 更改封閉檢測和報告錯誤

但希望這說明了基本ID ea:

就個人而言,我會(a)使String參數爲completionHandler可選; (b)添加另一個可選錯誤參數;和(c)加入錯誤處理的getPlayerID

func getPlayerID(completionHandler: ([String]?, ErrorType?) -> Void) { 
    Alamofire.request(.GET, "URL", headers: headers) 
     .responseJSON { request, response, result in 
      switch (result) { 
      case .Success(let value): 
       let json = JSON.self(value) 

       // variable to hold all of the results 

       var strings = [String]() 

       // populate the array of strings 

       for var index = 0; index < json.count; index++ { 
        if json[index]["Name"].stringValue == named { 
         strings.append(json[index]["FOO"].stringValue) 
        } 
       } 

       // call the completion handler with the strings 

       completionHandler(strings, nil) 
      case .Failure(_, let error): 
       completionHandler(nil, error) 
      } 
    } 
} 

然後,當你想叫它:

getPlayerID() { strings, error in 
    // use `strings` here 
} 

// but not here 
+0

非常感謝Rob。它奇妙地工作。我非常感謝你用這個答案超越和超越。 –

0

如果你讓你無法返回響應接收的值的異步請求在相同的功能導致它需要時間通過網絡發送請求到服務器並返回。解決此問題的最佳方法是將回調參數添加到您的函數中,而不是返回值。

func getPlayerID(named: String, callback:(foo:String)->()) { 

    Alamofire.request(.GET, "URL", headers: headers) 
     .responseJSON { response in 


      let json = JSON.self(response.result.value!) 

      for var index = 0; index < json.count; index++ { 
       if json[index]["Name"].stringValue == named { 
        var FOO = json[index]["FOO"].stringValue 
        callback(foo: FOO) // you fire callback here.. 
       } // If Statement End 
      } // For Loop End 
    } // Alamofire Request End 

} // getPlayerID Function End 

回調是一個塊對象,當你收到你的響應時會被觸發。因此,如果響應未到來(例如,互聯網連接斷開),回調將永遠不會被觸發。 實施例如何使用此:

self.getPlayerID("ototo") { (foo) ->() in 
    print("foo received = \(foo)") 
} 

也有是發送請求和接收響應之間的時間間隔。因此,在應用程序的用戶界面中添加UIActivityIndi​​catorView直到響應到達(並且在互聯網連接突然斷開時處理超時)是一種很好的做法。

相關問題