Возвращаемое значение на закрытие Swift

swift xcode closures return-value

726 просмотра

2 ответа

49 Репутация автора

Я работаю над проектом, и мне нужно заменить строку в моем 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
Автор: TheAbstractDev Источник Размещён: 18.07.2016 01:29

Ответы (2)


1 плюс

1558 Репутация автора

Учитывая, что вы работаете с API, основанным на асинхронном завершении, вам будет сложно работать процедурно (когда функции возвращают значения, а затем вы вызываете другие функции).

Модель обратных вызовов (обработчик завершения) предлагает использовать возвращаемые значения из обработчика завершения.

Другими словами - вы можете захотеть переместить ваш myXMLFile.stringByReplacingOccurrencesOfString()вызов в getSubtitles()обработчик завершения.

Автор: LiMar Размещён: 18.07.2016 01:39

0 плюса

2592 Репутация автора

Я думаю, что вы можете использовать семафор для этой проблемы, как:

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()
}
Автор: D4ttatraya Размещён: 14.06.2017 04:45
Вопросы из категории :
32x32