在Firebase 2.5.1中,这有效:
let post1Ref = sendRequestRef.childByAutoId()
post1Ref.setValue(request, withCompletionBlock: {( error:NSError?, ref:Firebase!) in
})
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何在3.x中实现它(因为完成的文档并没有真正告诉它)
let post1Ref = sendRequestRef.childByAutoId()
post1Ref.setValue(request, withCompletionBlock: {( error:NSError?, ref:Firebase!) in
if (error != nil) {
print("ERROR")
} else {
print("Success")
}
})
Run Code Online (Sandbox Code Playgroud)
这会引发错误:
使用未解决的Firebase
使用Firebase 3.x处理完成块的正确方法是什么?
ios firebase completionhandler swift firebase-realtime-database
我很好奇这些语法语句中哪一个(更)正确.游乐场愉快地编写了两个案例.
方法1
// copied from SO and this appears clear to me
UIView.animate(
withDuration: 3.0,
animations: {
},
completion: { (Bool) in
// completion code
}
)
Run Code Online (Sandbox Code Playgroud)
方法2
UIView.animate(
withDuration: 3.0,
animations: {
// code
}) {(Bool) in
// code when finished?
// argument label completion missing?
}
Run Code Online (Sandbox Code Playgroud)
为什么第二种方法中的圆括号在最后一个参数之前被关闭?或者是另一种实现UIView.animation?
我很困惑围绕swift 3中的完成处理程序的语法.
在下面的函数中,在xml从Web服务调用解析文件后,它应该返回一个变量(an array [String:String]).
我的尝试在下面,但显然是不正确的.
enum HistoryKey {
case success([String:String])
case failure(String)
}
private func getHistoryKeys(searchterm: String, completion: @escaping () -> HistoryKey) {
let url = PubmedAPI.createEsearchURL(searchString: searchterm)
let request = URLRequest.init(url: url as URL)
let task = session.dataTask(with: request) { (data, response, error) in
if let theData = data{
let myParser = XMLParser.init(data: theData)
myParser.delegate = self
myParser.parse()
}
}
task.resume()
if keys.isEmpty {
return .failure("no historyKeyDictionary")
}else{
return .success(keys)
}
}// End of func …Run Code Online (Sandbox Code Playgroud) 我不清楚这两个,现在世界正在转向封闭类型。但我不太清楚这一点。有人可以用一个实时的例子来解释我吗?
我们有一个函数,当它完成另一个函数时应该在它的完成块中调用,但是在完成块内的任何东西都不会被调用.这是功能:
func appendAllData (completion: () -> Void) {
guard let movieDetails = self.movieDetailsData else {
// handle nil case
return;
}
if let posterImage = self.movieDetailsData?.poster {
self.posterArray.append(posterImage)
}
if let overview = self.movieDetailsData?.overview {
self.overviewArray.append(overview)
}
if let releaseDate = self.movieDetailsData?.releaseData {
self.releaseInfoArray.append(releaseDate)
}
if let runtime = self.movieDetailsData?.runtime {
self.releaseInfoArray.append(String(describing: runtime))
}
if let genre = self.movieDetailsData?.genre {
if !genre.isEmpty {
self.releaseInfoArray.append(genre[0].name)
}
}
if let budget = self.movieDetailsData?.budget {
self.boxOfficeArray.append(budget)
}
if let revenue = self.movieDetailsData?.revenue { …Run Code Online (Sandbox Code Playgroud) 我正在快速访问闭包内的实例方法,在某些情况下自引用变为零,这会导致我的程序崩溃。我尝试访问 using但在self为[weak self]时无法调用实例方法。nil
[weak self] () -> () in
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用在 Xcode Playground 文件中运行的一段代码从本地服务器获取一些数据:
URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) -> Void in
if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
friend_ids = (jsonObj!.value(forKey: "friends") as? NSArray)!
}
}).resume()
return friend_ids
Run Code Online (Sandbox Code Playgroud)
在阅读了有关此主题的一些类似问题后,我知道 URLSession 异步运行,因此该函数在从服务器获取任何数据之前返回 nil 值。我还认为我理解完成处理程序可用于确保在继续之前实际获取数据,但不幸的是我并没有真正理解如何实现它。有人可以向我展示如何在这个简单的示例中使用完成处理程序,以确保在返回变量之前从服务器获取 ?
谢谢你!
每个 Swift 函数的末尾都有一个完成处理程序,如下所示:
func hello(_ name: String, completionHandler: (String) -> Void) {
completionHandler("Hello \(name).")
}
Run Code Online (Sandbox Code Playgroud)
可以这样调用:
hello("Stack Overflow", completionHandler: { text in
print(text)
})
// Prints Hello Stack Overflow.
Run Code Online (Sandbox Code Playgroud)
但也更简单:
hello("Stack Overflow") { text in
print(text)
}
// Prints Hello Stack Overflow.
Run Code Online (Sandbox Code Playgroud)
但是当在 Xcode 中编写代码并开始输入 hello 时,您将获得完整的功能。是否有一个简单的短代码,您可以按它立即从函数中删除completionHandler,还是必须手动执行此操作?
我的程序从 API 中提取数据,将预约数据返回到小部件中。我设置了一个闭包来处理从 API 中提取未知数量的页面。每次调用 loadResults 时,它都会从第 1 页开始查询 API,然后检查是否还有剩余页面,如果还有剩余页面需要拉取,则再次调用自身。一旦 API 的所有页面都被拉出并加载到我的数组中,它就会停止运行。
我正在 getTimeline 函数中加载 getAllResults 函数,并希望等到它完成运行后再加载我的时间线条目。
有没有办法在 getAllResults 上放置一个可选的完成处理程序,以便我可以使用此函数在完成处理程序完成后加载我的时间线条目?由于我多次调用它,我想让它递归运行直到完成,并能够提醒时间线它已完成并准备加载。
当前代码:
func getAllResults(){
loadResults { (pageReturned) in
if pageReturned == Int(totalPages)! {
pages = 1
parseData(apptReturn: apptList)
//end the call
} else if pageReturned < Int(totalPages)! {
pages = pages + 1
getAllResults()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在考虑类似的方法来命名完成处理程序并在嵌套闭包中调用它(但这不起作用)。有没有办法在 loadResults 闭包中引用 getAllResults 完成?
func getAllResults(completedResults completion: @escaping (Bool) -> ()){
loadResults { (pageReturned) in
if pageReturned == Int(totalPages)! {
pages = 1 …Run Code Online (Sandbox Code Playgroud) 我遵循代码,但收到completionHandler 错误
没有更多上下文,表达类型不明确
据我了解,这是由于completionHandler 不匹配造成的。如何为completionHandler 返回错误的字符串/有意义的详细信息?
func fetch(urlString: String, completionHandler: @escaping (T?, Error?) -> Void) -> Void {
//...
guard let url = URL(string: urlString) else {
print("Failed to create URL!")
DispatchQueue.main.async {
completionHandler(nil, "Bad URL") // gives error: Type of expression is ambiguous without more context
}
return
}
}
Run Code Online (Sandbox Code Playgroud)