在Swift 3中涉猎MVVM

MVVM(model-view-viewModel)是一种架构模式,可以替代MVC(model-view-controller)。 MVVM,有时也称为表示模型,提供了一种组织代码的方式,而不会导致大量的视图控制器。

在MVVM中,您将代码抽象为包括viewModel,该模型是一个文件,其中包含要在视图中显示的值。 我们编写的用于格式化值(即格式化要插入到UILabel中的字符串的格式)以呈现给视图的逻辑发生在viewModel中。

View Controller拥有viewModel,该ViewModel拥有Model,而Model又更新了View Model,后者又用于更新View Controller,后者又更新了视图。

在这个博客中,我将向您展示一个简单的示例,说明如何使用MVVM架构模式抽象代码。 为了说明这一点,我将制作一个将在iTunes商店中显示当前排名前100的免费应用的应用。 该应用程序将使用tableView并需要联网到iTunes API端点。 我将在我的过程中包括联网步骤。

步骤1:设定APIClient

我使用的API来自iTunes的RSS Feed Generator,不需要密钥或授权令牌。 端点是:https://rss.itunes.apple.com/api/v1/us/ios-apps/top-free/100/explicit/json

#1:我创建了一个从NSObject继承的APIClient类。 稍后在我的viewModel中实例化此APIClient时,从NSObject继承非常重要。

#2:我编写了一个具有完成处理程序的fetchAppList函数。 完成处理程序将包含NSDictionaries的可选数组。 JSON数据将以字典数组的形式返回,用于下面的关键“结果”。

#3:我从iTunes端点创建和解开URL。

#4:创建一个URLSession。

#5:从我们的dataTask中解包我们返回的数据。

#6:由于JSON序列化会引发错误,请使用do / try / catch创建我们的JSON对象并处理我们的错误。 我解包了responseJSON对象,并将其强制转换为NSDictionary,然后选择.allowFragments选项。

#7:从我的responseJSON对象中,我有一个用于“结果”键的字典数组,因此我可以访问它并创建一个对象并将其转换为NSDictionaries数组。 请注意我如何从keyPath “ feed.results”访问此文件。 您可以通过keyPath访问JSON字典值! 🌮

#8:我使用NSDictionaries的apps数组设置完成处理程序。

#9:如果收到错误,则将完成处理程序设置为nil。

#10:我继续执行dataTask。 永远记住要这样做。

步骤2:设置ViewModel。

#1:我创建了一个继承自NSObject的ViewModel文件。 此viewModel将是我的View Controller中的一个属性,并由情节提要插入。

#2:我创建一个标记为@IBOutletapiClient属性,该属性将由情节提要实例化。 因为我知道情节提要将注入它,所以我可以使用(!)bang运算符,因为我知道它不会为零。

#3:我定义了一个应用程序字典,该字典将保存通过我的iTunesClient的apiClient调用检索到的应用程序。

#4:编写一个函数,该函数将触发对iTunes API的apiClient调用,返回数据并设置一个完成处理程序,该处理程序准备好重新加载要显示的数据。

#5:调用我们的apiClient属性来获取我们的应用。

#6:将这段代码放在主线程上,因为我们预计它会如何影响视图控制器中表视图中的UI。

#7:将本地应用程序数组分配给我们返回的NSDictionaries JSON。

#8:调用完成处理程序,以便我们知道何时可以开始在View Controller中重新加载数据。

接下来,我们编写可以在表视图控制器中调用的函数。 这些功能将提供要在表视图控制器的单元格中显示的值。

#9:编写一个接受tableView节索引的函数(尽管在此示例中,我们只准备一个节)并返回该节的单元格行数。 在这里,我返回了应用程序数组大小的计数。

#10:编写一个返回应用程序名称的函数。 请注意,由于我们的apps数组包含NSDictionaries以及每个应用程序的信息,因此我在每个应用程序NSDictionary中找到keyPath “名称”的值。

#11:编写返回应用程序评级的函数。 请注意,由于我们的apps数组包含NSDictionaries以及每个应用程序的信息,因此我在每个应用程序NSDictionary中找到keyPath “ contentAdvisoryRating”的值。

请注意,如果我无法将值转换为字符串或整数,如何返回空字符串或“ 0”。

步骤3:设置表视图控制器

#1:使用@IBOutlet声明可选的viewModel属性。 故事板将实例化此viewModel对象。

#2:在viewDidLoad()中,访问我们的viewModel属性以获取我们的应用程序对象。

#3:重新加载tableView以显示我们检索到的应用程序对象。

在tableView方法中从viewModel分配我们的应用程序值。

#4:调用viewModel的numberOfItemsToDisplay(_ 🙂函数以返回行数。

#5:使用viewModel中的值填充单元格。

#6。 创建一个具有单元格标识符“ cell”的单元格对象。

#7和#8:调用viewModel的appTitleToDisplay(_ :)函数和appRatingToDisplay(_ 🙂函数以返回要在tableView中显示的应用名称(作为字符串)和应用评分(作为字符串)。

步骤4:设定情节提要

#1:将View Controller替换为TableViewController。

#2:将类设置为TopAppsTableViewController.swift文件。

#3:选择单元格并将其样式更改为Right Detail。

#4:将标识符设置为“ cell”(它将匹配我们在TopAppsTableViewController.swift文件中编写的标识符)。

#5:从对象库中,将一个对象拖到您的表视图控制器上,并将其插入到顶部。

#6:选择表格视图控制器顶部的对象。

#7:将此对象的类设置为您创建的ViewModel.swift文件。

#8和#9:使用助手编辑器从ViewModel对象控制拖动到在TopAppsTableViewController.swift文件中创建的viewModel @IBOutlet

#10:此连接现在应显示在“连接检查器”中。

#11:将另一个对象从“对象库”拖到表视图控制器上。

#12:选择此新对象,并将其分配给您的APIClient.swift文件。

#13:从viewModel对象按住Control拖动到您刚创建的Api Client对象。 确保此出口显示在“连接检查器”中。

#14:确保在Attributes Inspector中将此表视图控制器设置为初始视图控制器。

生成并运行。 您刚刚使用MVVM,通过使用viewModel类来容纳值以填充表视图,从而将模型值逻辑与视图逻辑分开。

查看最终产品:

可以在这里找到该博客项目的仓库。