我正在使用Alamofire来废弃网页以获取一些数据,比如说新闻。新闻是一个具有标题、内容、图片、日期、作者等内容的通用对象。但是对于每个网站,我使用不同的方法。有些使用json,有些使用hpple提取数据。如何为每个网站创建某种服务。我应该为每个网站创建不同的服务,还是有更好的方法为每个网站使用某种通用的功能模板。就像

Login()
Fetch()
Populate()
return News(…..)

然后,在创建新闻并填充tableview之后,如何刷新news对象?因为新闻是一般性的,所以它不知道是谁用什么方法创造的。

最佳答案

有很多方法可以设计这种类型的抽象。如果可能的话,我倾向于在我的建筑设计中尽可能地倾向于简单。这里一个很好的模式是使用带有类方法的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)")
        }
    )
}

你可以随意修改设计,但是你想根据你的用例来调整它。这些图案都不是一成不变的。它只是提供了一种构建不同服务的通用方法。@mattt在AlamofireREADME中也有一些非常酷的模式(路由器和CRUD),我强烈建议您通读。它们肯定更复杂,但仍然需要一个Service类型的对象来最大化代码重用。
希望这能给我们一些启示。

关于swift - 多个网站的多个Alamofire请求的正确模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28984518/

10-12 01:43