2016-12-23 27 views
0

我想在Segue调用上进行2个API调用,并最终将第二个调用的数据数组传递到CollectionView。随着第一个电话我得到一个值catID,这是我需要,以使其他电话:问题传递数据到函数内的segue.destination内函数

let searchEndpoint: String = MY_ENDPOINT 

// Add auth key 
let serviceCallWithParams = searchEndpoint + "?PARAMETER" 
guard let url = URL(string: serviceCallWithParams) else { 
    print("Error: cannot create URL") 
    return 
} 

let urlRequest = URLRequest(url: url) 

// setting up the session 
let config = URLSessionConfiguration.default 
let session = URLSession(configuration: config) 

// making the request 
let task = session.dataTask(with: urlRequest) { 
    (data, response, error) in 
    // error check 
    guard error == nil else { 
     print("error") 
     print(error) 
     return 
    } 
    // make sure we got data 
    guard let responseData = data else { 
     print("Error: did not receive data") 
     return 
    } 
    // parse JSON 
    do { 
     guard let catData = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: AnyObject] else { 
      print("error converting data to JSON") 
      return 
     } 
     if let data = catData["data"] as? [String: Any] { 
      if let array = data["categories"] as? [Any] { 
       if let firstObject = array.first as? [String: Any] { 
        if let catId = firstObject["catId"] as? Int { 
         getTitles(catId: catId) 
        } 
       } 
      } 
     } 

    } catch { 
     print("error converting data to JSON") 
     return 
    } 
} 
task.resume() 

然后getTitles功能如下:

​​

现在当我把:

let resultsVC = segue.destination as? CollectionViewController 
resultsVC?.books = self.books 

外部函数,在目标控制器中我得到一个空数组作为第一次点击输出,但在每一个下一个我得到正确的数据。 当我试图把这个内部函数“getTitles”在CollectionViewController输出“无”每次。 值得提及的是,我有“书” 规定,像这样变量:

主控制器:

var books: [Book]? = [] 

采集控制器:

var books: [Book]? 

和我创建了基本上以3 str为对象的[Book]类型变量在单独的结构中。

所有上面的代码被封装在

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "ShowResults" { 

的任何帮助/指导将不胜感激!

+0

当你写self.performSegueWithIdentifier(“ShowResults”,发件人:无)?添加调用Segue的代码。 –

+0

你的API调用将异步完成,所以你需要从完成关闭 – Paulw11

回答

0

当你使api调用它将在后台执行意味着asynchronously其中prepare(for:sender:)将调用synchronously

现在从你的问题是看起来像你必须建立在故事板SEGUE从ButtonViewController,让你从你的API响应,然后移动到你的目标控制器,以解决您的问题,您需要从创建SEGUE你的Source ViewController到Destination ViewController并设置它的标识符。之后在for循环之后执行getTitles(catId: Int)方法在主线程上执行segue。

for (index, value) in titlesArray.enumerated() { 
    var book = Book() 
    book.bookTitle = value["title"] as? String 
    book.bookAuthor = value["author"] as? String 
    if let imageSource = value["_links"] as? Array<AnyObject> { 
     book.bookImageSource = imageSource[1]["href"] as? String 
    } 
    self.books?.append(book) 
} 

DispatchQueue.main.async { 
    self.performSegue(withIdentifier: "ShowResults", sender: nil) 
} 

之后,在您的prepare(for:sender:)内部进行如下更改。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "ShowResults" { 
      let resultsVC = segue.destination as? CollectionViewController 
      resultsVC?.books = self.books 
    } 
} 
+0

执行你的继续,当然这是做的伎俩,非常感谢! – dimitri