将嵌套的完成处理程序传递到另一个 class
Passing a completion handler nested into another class
我正在开发一个使用 Swift
的图书馆。我想知道在下面的场景中有没有更好的方法可以使用,
ViewController.swift
Movie.searchMovie(name: “AVENGERS”, completionHandler: (Result<[MovieInfo],Error>))
上面的控制器来自示例应用程序,我在其中调用了电影库中的 public 方法。
Movie.swift
public class Movie: NSObject {
public class func searchMovie(name: String, completionHandler: (Result<[MovieInfo],Error>)) {
Records.sharedInstance.searchMovieWithName(name: name, completionBlock: { (data, error) in
guard data != nil else {
completionBlock(Result.failure(error ?? “ERROR” as! Error))
}
guard let list = data as? [Item] else {
completionBlock(Result.failure(error ?? "ERROR" as! Error))
}
completionBlock(Result.success(list))
})
}
}
和
Records.swift
func searchMovieWithName(name: String, completionHandler: (Result<[MovieInfo],Error>)) {
//Implementation to search
}
这是怎么做到的?无论如何我可以用完成处理程序做得更好吗?
问题是您的 completionHandler
不是完成处理程序:
public class func searchMovie(
name: String, completionHandler: (Result<[MovieInfo],Error>))
它只是一个结果对象。处理程序是一个函数:
public class func searchMovie(
name: String, completionHandler: (Result<[MovieInfo],Error>) -> Void)
现在您有一个完成处理程序,您可以使用 Result 参数调用它。
我正在开发一个使用 Swift
的图书馆。我想知道在下面的场景中有没有更好的方法可以使用,
ViewController.swift
Movie.searchMovie(name: “AVENGERS”, completionHandler: (Result<[MovieInfo],Error>))
上面的控制器来自示例应用程序,我在其中调用了电影库中的 public 方法。
Movie.swift
public class Movie: NSObject {
public class func searchMovie(name: String, completionHandler: (Result<[MovieInfo],Error>)) {
Records.sharedInstance.searchMovieWithName(name: name, completionBlock: { (data, error) in
guard data != nil else {
completionBlock(Result.failure(error ?? “ERROR” as! Error))
}
guard let list = data as? [Item] else {
completionBlock(Result.failure(error ?? "ERROR" as! Error))
}
completionBlock(Result.success(list))
})
}
}
和
Records.swift
func searchMovieWithName(name: String, completionHandler: (Result<[MovieInfo],Error>)) {
//Implementation to search
}
这是怎么做到的?无论如何我可以用完成处理程序做得更好吗?
问题是您的 completionHandler
不是完成处理程序:
public class func searchMovie(
name: String, completionHandler: (Result<[MovieInfo],Error>))
它只是一个结果对象。处理程序是一个函数:
public class func searchMovie(
name: String, completionHandler: (Result<[MovieInfo],Error>) -> Void)
现在您有一个完成处理程序,您可以使用 Result 参数调用它。