代码之家  ›  专栏  ›  技术社区  ›  John Doe

Swift模型对象是否应该调用API?

  •  0
  • John Doe  · 技术社区  · 6 年前

    我想知道我是否遵循MVC架构模式,在我的模型类中,我可以调用API吗?

    class DataModel {
        var data = "Some data that's a string"
        func getAPIData(){
           self.data = self.NetworkFunctionsClass.MakeAPICallFunction()
        }
    }
    

    我不是直接在模型类中生成函数

    这是允许的吗?或者我引入了一些操作而不是存储数据,从而违反了模型规则?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Ahmad F    6 年前

    在我的模型类中,我可以调用API吗?

    没有什么限制你这么做,但通常 预期。从标准MVC的传统观点来看 控制器 层负责这样的任务。

    但是,为了避免“海量视图控制器”问题,可以应用“MVC-N”方法。实际上,它只是一个标准的MVC+网络客户端!从而导致:

    • 避免在每个视图控制器中复制网络逻辑。
    • 使视图控制器不那么“庞大”。

    所以,可以这样说:

    显然,网络处理API请求、反序列化响应(作为模型)并将其传递给视图控制器;因此控制器应该 了解模特。网络和控制器层之间的通信通常由 关闭 ,有时您可能需要遵循委托的方法。

    回到您的案例,您将把代码优化为(伪代码):

    class DataModel {
        var data = "Some data that's a string"
    }
    
    // separating the networking logic in another class:
    class Networking {
        func getAPIData(url: URL, parameters: [String: Any], response: @escaping (_ dataModel: DataModel) -> Void) {
            // ...
    
            // here, you should pass the returned data model:
            response(DataModel())
        }
    }
    

    在视图控制器中:

    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // somewhere in the view controller, you could pass it as:
            Networking().getAPIData(url: ..., parameters: ...) { data in
                // here, you can access `data`...
            }
        }
    }
    

    当然,该逻辑也适用于任何指定的任务功能,而不仅仅是网络功能,例如获取设备照片(访问系统资源)或从磁盘写入/读取数据。

        2
  •  0
  •   gnasher729    6 年前

    在一个数据模型类中,我通常有init,它可以从API提供的任何内容创建模型类的实例;如果我必须使用两个API,我将有两个init方法。当然,如果我将数据模型实例发送到API,那么方法可以创建API所期望的任何数据。

    因此,如果我有一个API将数据作为JSON传递,另一个API使用完全不同的名称将数据作为XML传递(我通常无法控制API中的命名),那么我将有两个in I t将JSON或XML作为参数。

    在我看来,做网络接入是一个过分的步骤。尤其是因为我经常使用包含由不同模型对象表示的数据的api。就像一个“库”API,它可以返回一本书、一张CD或一张DVD,调用应该产生三个不同的模型类中的一个。在这种情况下,您可能没有API调用“give me a book”,只有“give me an item In the library”返回可能属于几个模型类之一的实例。