多个网站的多个 Alamofire 请求的正确模型
Proper model for multiple Alamofire requests for multiple websites
我正在使用 Alamofire 抓取网页中的一些数据,比方说新闻。新闻是一个通用的object,带有标题、内容、图片、日期、作者等内容。但是对于每个网站,我使用不同的方法。对于某些人,我使用 json 对于其他人,我使用 hpple 来提取数据。我怎样才能为每个网站创建某种服务。我应该为每个网站创建不同的服务,还是有更好的方法为每个网站使用某种通用功能模板。喜欢
Login()
Fetch()
Populate()
return News(…..)
那么在创建新闻并填充表格视图后,如何刷新新闻object?由于 News 是通用的,它无法知道是谁用什么方法创建的。
有很多方法可以设计这种类型的抽象。如果可能的话,我倾向于在我的建筑设计中尽可能地倾向于简单。这里的一个很好的模式是使用带有 class 方法的 Service
对象来处理调用不同的服务、解析结果并调用成功或失败的闭包。
您还可以使用不将成功和失败分为两部分的完成处理程序,但是您需要处理我不太喜欢的调用者对象中的失败或成功。下面是 Service
设计的一个例子。
第一新闻服务
import Alamofire
struct News {
let title: String
let content: String
let date: NSDate
let author: String
}
class FirstNewsService {
typealias NewsSuccessHandler = ([News]) -> Void
typealias NewsFailureHandler = (NSHTTPURLResponse?, AnyObject?, NSError?) -> Void
// MARK: - Fetching News Methods
class func getNews(#success: NewsSuccessHandler, failure: NewsFailureHandler) {
login(
success: { apiKey in
FirstNewsService.fetch(
apiKey: apiKey,
success: { news in
success(news)
},
failure: { response, json, error in
failure(response, json, error)
}
)
},
failure: { response, json, error in
failure(response, json, error)
}
)
}
// MARK: - Private - Helper Methods
private class func login(#success: (String) -> Void, failure: (NSHTTPURLResponse?, AnyObject?, NSError?) -> Void) {
let request = Alamofire.request(.GET, "login/url")
request.responseJSON { _, response, json, error in
if let error = error {
failure(response, json, error)
} else {
// NOTE: You'll need to parse here...I would suggest using SwiftyJSON
let apiKey = "12345678"
success(apiKey)
}
}
}
private class func fetch(
#apiKey: String,
success: ([News]) -> Void,
failure: (NSHTTPURLResponse?, AnyObject?, NSError?) -> Void)
{
let request = Alamofire.request(.GET, "fetch/url")
request.responseJSON { _, _, json, error in
if let error = error {
failure(response, json, error)
} else {
// NOTE: You'll need to parse here...I would suggest using SwiftyJSON
let news = [News]()
success(news)
}
}
}
}
视图控制器内部
override func viewDidLoad() {
super.viewDidLoad()
FirstNewsService.getNews(
success: { news in
// Do something awesome with that news
self.tableView.reloadData()
},
failure: { response, json, error in
// Be flexible here...do you want to retry, pull to refresh, does it matter what the response status code was?
println("Response: \(response)")
println("Error: \(error)")
}
)
}
随意 mod 设计,但您可以根据自己的用例对其进行定制。 None 这种模式是一成不变的。它只是为您提供了一种构建不同服务的通用方法。 @mattt 在 Alamofire README 中也有一些非常酷的模式(路由器和 CRUD),我强烈建议通读。它们肯定更复杂,但仍然需要 Service
类型的对象来最大化代码重用。
希望这有助于阐明一些问题。
我正在使用 Alamofire 抓取网页中的一些数据,比方说新闻。新闻是一个通用的object,带有标题、内容、图片、日期、作者等内容。但是对于每个网站,我使用不同的方法。对于某些人,我使用 json 对于其他人,我使用 hpple 来提取数据。我怎样才能为每个网站创建某种服务。我应该为每个网站创建不同的服务,还是有更好的方法为每个网站使用某种通用功能模板。喜欢
Login()
Fetch()
Populate()
return News(…..)
那么在创建新闻并填充表格视图后,如何刷新新闻object?由于 News 是通用的,它无法知道是谁用什么方法创建的。
有很多方法可以设计这种类型的抽象。如果可能的话,我倾向于在我的建筑设计中尽可能地倾向于简单。这里的一个很好的模式是使用带有 class 方法的 Service
对象来处理调用不同的服务、解析结果并调用成功或失败的闭包。
您还可以使用不将成功和失败分为两部分的完成处理程序,但是您需要处理我不太喜欢的调用者对象中的失败或成功。下面是 Service
设计的一个例子。
第一新闻服务
import Alamofire
struct News {
let title: String
let content: String
let date: NSDate
let author: String
}
class FirstNewsService {
typealias NewsSuccessHandler = ([News]) -> Void
typealias NewsFailureHandler = (NSHTTPURLResponse?, AnyObject?, NSError?) -> Void
// MARK: - Fetching News Methods
class func getNews(#success: NewsSuccessHandler, failure: NewsFailureHandler) {
login(
success: { apiKey in
FirstNewsService.fetch(
apiKey: apiKey,
success: { news in
success(news)
},
failure: { response, json, error in
failure(response, json, error)
}
)
},
failure: { response, json, error in
failure(response, json, error)
}
)
}
// MARK: - Private - Helper Methods
private class func login(#success: (String) -> Void, failure: (NSHTTPURLResponse?, AnyObject?, NSError?) -> Void) {
let request = Alamofire.request(.GET, "login/url")
request.responseJSON { _, response, json, error in
if let error = error {
failure(response, json, error)
} else {
// NOTE: You'll need to parse here...I would suggest using SwiftyJSON
let apiKey = "12345678"
success(apiKey)
}
}
}
private class func fetch(
#apiKey: String,
success: ([News]) -> Void,
failure: (NSHTTPURLResponse?, AnyObject?, NSError?) -> Void)
{
let request = Alamofire.request(.GET, "fetch/url")
request.responseJSON { _, _, json, error in
if let error = error {
failure(response, json, error)
} else {
// NOTE: You'll need to parse here...I would suggest using SwiftyJSON
let news = [News]()
success(news)
}
}
}
}
视图控制器内部
override func viewDidLoad() {
super.viewDidLoad()
FirstNewsService.getNews(
success: { news in
// Do something awesome with that news
self.tableView.reloadData()
},
failure: { response, json, error in
// Be flexible here...do you want to retry, pull to refresh, does it matter what the response status code was?
println("Response: \(response)")
println("Error: \(error)")
}
)
}
随意 mod 设计,但您可以根据自己的用例对其进行定制。 None 这种模式是一成不变的。它只是为您提供了一种构建不同服务的通用方法。 @mattt 在 Alamofire README 中也有一些非常酷的模式(路由器和 CRUD),我强烈建议通读。它们肯定更复杂,但仍然需要 Service
类型的对象来最大化代码重用。
希望这有助于阐明一些问题。