关闭Swift

时间:2016-07-18 13:29:15

标签: swift xcode closures return-value

我正在处理一个项目,我必须用我的xmlFile替换一个字符串,该字符串包含以逗号分隔的字幕语言。

问题是我的字幕有封闭功能但我无法返回值,但我必须在变量中存储字幕。

以下是我的代码

的示例
func searchSubtitles(completion: ([String] -> Void)) {
   // GET Request for subtitles
   // ....
   completion(["fr", "en", "it", "es"])
}

func getSubtitles(completion:(String -> Void)) {
  var subs = ""
  searchSubtitles { (data) in
    for i in 0 ..< data.count {
      subs.appendContentsOf(data[i])
      subs.appendContentsOf(", ")
    }
  }
}

var SubStr: String {
  // have to return the string who contains all subtitles
}

// ...

myXMLFile = myXMLFile.stringByReplacingOccurrencesOfString("{{SUBS}}", withString: SubStr)
// Adding subs to my file

2 个答案:

答案 0 :(得分:1)

鉴于您使用基于异步完成的API,您将难以在程序上工作(当函数返回值然后调用其他函数时)。

回调(完成处理程序)模型建议使用完成处理程序中的返回值。

换句话说 - 您可能希望将myXMLFile.stringByReplacingOccurrencesOfString()调用INTO getSubtitles()完成处理程序。

答案 1 :(得分:0)

我认为您可以将信号量用于此问题:

func getSubtitles() -> String {
  let sem = DispatchSemaphore(value: 0)
  var subs = ""
  searchSubtitles { (data) in
    for i in 0 ..< data.count {
      subs.appendContentsOf(data[i])
      subs.appendContentsOf(", ")
    }
    sem.signal()
  }
  sem.wait(timeout: .distantFuture)
  return subs
}

var SubStr: String {
  // have to return the string who contains all subtitles
  return getSubtitles()
}