2017-10-18 49 views
1

我刚刚开始在Swift中编程,并试图从我的API中获取一些结果,但据我所知,我不能简单地从函数返回,因为它是异步的。我正在使用Alamofire和SwiftyJSON。Swift使用Alamofire获取Item对象的数组

func getItems(completionHandler: @escaping ([Item], Error?) ->()) { 
     getData(url: API.getUrl, completionHandler: completionHandler) 
    } 

public func getData(url: URL, parameters: [String: AnyObject]? = nil, completionHandler: @escaping ([Item], Error?) ->()) { 
    Alamofire.request(url, method: .get) 
     .responseJSON { response in 
      switch response.result { 
      case .success(let val): 
       let json = JSON(val) 
       if let array = json.array { 
        var itemArray: [Item] = [] 
        for item in array { 
         guard let dictionary = item.dictionaryObject else { 
          continue 
         } 
         itemArray.append(item) 
        } 
        completionHandler(itemArray, nil) 
       } 
      case .failure(let error): 
       print(error) 
      } 
    } 
} 

这是一个分离的类,其中我做了这些操作,因此完成了处理程序。我有一个简单的Item类定义,我想在我的ViewController(使用对象数组后来填充表)中获得一个数组。但是,它似乎并没有像这样工作?

var array = [Item] 
let manager = APIManager() 
APIManager.getItems(){ response in 
    array = ... 
} 

这就是我的想法,但我不确定它是如何工作的。有什么想法吗?所有的帮助表示赞赏。

编辑:最初,它在completionhandler中使用了NSDictionary,它仍然在代码中。这个想法是只返回一个对象

回答

1

数组你定义你的回调为([Item], Error?) ->()所以你应该使用它作为:

var array = [Item] 
let manager = APIManager() 
APIManager.getItems() { items, error in 
    array = items 
    //and then you can reload tableview if it uses array as its source 
} 
+0

我一直在经历的代码,并在我的ViewController把上面这段代码。它似乎一路顺利,因为有数据,但它不会将任何数据放入'array'中?保留空 – dnsko

+0

你尝试使用断点吗?也许你没有任何东西从我做的 –

+0

,即使在打印数据的地方被分配给'array'时,它显示了两个项目。在将其添加到其中时似乎出错。我的数组是这样声明的:'var array = [Item())',当我删除括号时,当我的代码和打印元素中的'array = items'中的断点出现错误时,它会出错 – dnsko