首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift iOS应用的组网结构

Swift iOS应用的组网结构
EN

Code Review用户
提问于 2019-03-27 04:52:25
回答 1查看 455关注 0票数 5

我想要任何建设性的意见,关于这个简单的应用程序的结构,它需要一个API响应,然后显示在表视图上。

该URL被写入一个ConstantsAPI文件中。

代码语言:javascript
复制
let baseUrl : String = "https://haveibeenpwned.com/api/v2"
let breachesExtensionURL : String = "/breaches"

显示在Tableview控制器上

代码语言:javascript
复制
class SitewideTableViewController: UITableViewController, DataManagerDelegate {
    var pwnedData = [BreachModel]()
    var session: URLSession!
    var task: URLSessionDownloadTask!

    override func viewDidLoad() {
        super.viewDidLoad()
        session = URLSession.shared
        task = URLSessionDownloadTask()
        DataManager.shared.delegate = self
        DataManager.shared.fetchBreaches()
    }

    func didDownloadBreaches() {
        DispatchQueue.main.async {
            self.pwnedData = DataManager.shared.sortedBreaches()
            self.tableView.reloadData()
        }
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return pwnedData.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Sitewide", for: indexPath)
        cell.textLabel?.text = pwnedData[indexPath.row].name
        return cell
    }
}

使用以下模型

代码语言:javascript
复制
import Foundation

class BreachModel : Codable {
    let name : String
    let title : String
    let domain : String
    let breachDate : String
    let addedDate : String
    let modifiedData : String
    let pwnCount : Int
    let description: String

    private enum CodingKeys: String, CodingKey {
        case name = "Name"
        case title = "Title"
        case domain = "Domain"
        case breachDate = "BreachDate"
        case addedDate = "AddedDate"
        case modifiedData = "ModifiedDate"
        case pwnCount = "PwnCount"
        case description = "Description"
    }
}

使用管理所有数据的数据管理器。

代码语言:javascript
复制
@objc protocol DataManagerDelegate: class {
    // optional delegate to practice
    @objc optional func didDownloadBreaches() // called when the manager has completed downloading all the breaches
}


    class DataManager {
        static let shared: DataManager = DataManager()
        public weak var delegate: DataManagerDelegate? = nil

        private var breaches = [BreachModel]()
        func fetchBreaches() {

            HTTPManager.shared.get(urlString: baseUrl + breachesExtensionURL, completionBlock:  { [weak self] (data: Data?) -> Void in
                let decoder = JSONDecoder()
                if let data = data{
                    print(data.count)
                    do {
                        self?.breaches = try decoder.decode([BreachModel].self, from: data)
                        self?.delegate?.didDownloadBreaches?()
                    } catch let error {
                        print ("Error in reading data", error)
                    }
                }
                }
            )
        }

        func sortedBreaches() -> [BreachModel] {
            return breaches.sorted{ a,b in a.name < b.name }
        }
    }

调用HTTP管理器,其唯一职责是调用url的

代码语言:javascript
复制
class HTTPManager {
    static let shared: HTTPManager = HTTPManager()
    public func get (urlString: String, completionBlock: ((Data?) -> Void)?) {
        let url = URL(string: urlString)
        if let usableUrl = url {
            let request = URLRequest(url: usableUrl)
            let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
                completionBlock?(data)
            })
            task.resume()
        }
    }
}

那么,这是一个合理的可扩展结构吗?我应该使用dataTask还是URLSessionDownloadTask?我是不是无意中引入了一些内存泄漏?

任何值得赞赏的评论,我熟悉Swift的书,但发现其他教程往往只是显示可编码或API的使用,而不是通过整个结构(至少不是在一个适当的水平对我来说)。上面的代码确实有效,我正在考虑在将来构建它,但希望遵循某种形式的最佳实践(不管多么琐碎)。

Git链接:https://github.com/stevencurtis/basicnetworking

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-04-04 07:37:36

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/216310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档