Swift iOS分层架构设计的概念

在本章中主要学习到了,分层架构的设计,其实就是分文件夹来创建View,Controller,Model的类文件

• 表示层,相当于TP中的View

用户与系统交互的组件集合。用户通过这一层向系统提交请求或发出指令,系统通过这一层接收用户 请求或指令,待指令消化吸收后再调用下一层,接着将调用结果展现到这一层。表示层应该是轻薄的,不应该具 有业务逻辑。

• 业务逻辑层,相当于TP中的Controller

系统的核心业务处理层。负责接收表示层的指令和数据,待指令和数据消化吸收后,再进行组织 业务逻辑的处理,并将结果返回给表示层。

• 数据持久层,相当于TP中的Model

数据持久层用于访问信息系统层,即访问数据库或文件操作的代码应该只能放到数据持久层中, 而不能出现在其它层中。

• 信息系统层,相当于开发WEB时用到数据库

系统的数据来源,可以是数据库、文件、遗留系统或者网络数据。

以下为分层架构设计实现的一个Note备忘录的DemoCode

数据持久层,PersistenceLayer/Note.swift 、NoteDAO.swift

业务领域对像类,可以理解为PHP框架开中的 数据库中的表

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import Foundation

//业务领域对像类,可以理解为PHP框架开中的 数据库中的表

class Note {

     

    let Date: NSDate

    var Content: NSString

     

    init(date:NSDate,content:NSString) {

        self.Date date

        self.Content = content

    }

}

DAO类,一般按表名命名,相当于PHP框架加的 Model

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

import Foundation

//DAO类,一般按表名命名,相当于PHP框架加的 Model

class NoteDAO {

     

    //保存数据列var,没用数据,数据保存到内存中

    var listData: NSMutableArray! //可变数组类型

     

    //只进行和数据库的交互,不需要保持任何状态,所以可以使用单例模式

    private static let sharedInstance = NoteDAO() //单例的实例保存这个属性中

    class var sharedFoo: NoteDAO { //swift中的静态计算属性

         

        //添加一些测试数据

        let dateFormatter : DateFormatter = DateFormatter()

        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

         

        let date1: NSDate = dateFormatter.date(from: "2015-01-01 16:01:03")! as NSDate

        let note1: Note = Note(date:date1, content: "Welcome to MyNote.")

         

        let date2: NSDate = dateFormatter.date(from: "2015-01-02 8:01:03")! as NSDate

        let note2: Note = Note(date:date2, content: "欢迎使用MyNote。")

         

        //这里需要先实例化,才能添加值

        sharedInstance.listData = NSMutableArray()

        sharedInstance.listData.add(note1) //listData字典里面放的Note对像

        sharedInstance.listData.add(note2)

         

        return sharedInstance

    }

     

    //插入Note方法

    func create(model: Note) -> Int {

        self.listData.add(model)

        return 0

    }

     

    //删除Note方法

    func remove(model: Note) -> Int {

        for note in self.listData {

            let note2 = note as! Note

            //比较日期主键是否相等

            if note2.Date == model.Date {

                self.listData.remove(note2)

                break

            }

        }

        return 0

    }

     

    //修改Note.Content方法

    func modify(model: Note) -> Int {

        for note in self.listData {

            let note2 = note as! Note

            //比较日期主键是否相等

            if note2.Date == model.Date {

                note2.Content = model.Content

                break

            }

        }

        return 0

    }

     

    //查询所有数据方法

    func findAll() -> NSMutableArray {

        return self.listData

    }

     

    //修改Note方法

    func findById(model: Note) -> Note? {//返回类型为可选的,说明Note可以返回nil

        for note in self.listData {

            let note2 = note as! Note

            //比较日期主键是否相等

            if note2.Date == model.Date {

                return note2

            }

        }

        return nil

    }

}

业务逻辑层,BusinessLogicLayer/NoteBL.swift

业务逻辑层类,相当于PHP框架中的 Controller

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

import Foundation

//业务逻辑层类,相当于PHP框架中的 Controller

class NoteBL {

    //插入Note方法

    func createNote(model: Note) -> NSMutableArray {

        let dao:NoteDAO = NoteDAO.sharedFoo

        dao.create(model: model) //会有警告,因为create方法有返回值但在这里并没有使用

        return dao.findAll()

    }

     

    //删除Note方法

    func remove(model: Note) -> NSMutableArray {

        let dao:NoteDAO = NoteDAO.sharedFoo

        dao.remove(model: model)

        return dao.findAll()

    }

     

    //查询所用数据方法

    func findAll() -> NSMutableArray {

        let dao:NoteDAO = NoteDAO.sharedFoo

        return dao.findAll()

    }

     

}

表示层,presentationLayer/MasterViewController.swift 、DetailViewController.swift、AddViewController.swift

MasterViewController.swift

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

import UIKit

//Table列表页面

class MasterViewController: UITableViewController {

    let BL:NoteBL = NoteBL()

    var detailViewController: DetailViewController? = nil

    var objects = NSMutableArray()

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        self.navigationItem.leftBarButtonItem = self.editButtonItem

        //let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:)))

        //self.navigationItem.rightBarButtonItem = addButton

        if let split = self.splitViewController {

            let controllers = split.viewControllers

            self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController

        }

         

        //查出所有数据

        self.objects = self.BL.findAll()

         

        //(接收通知)监听通知事件RegisterCompletionNotification,交给registerCompletion函数处理

        NotificationCenter.default.addObserver(self, selector: #selector(CreateNoteList(notification:)), name: NSNotification.Name.init(rawValue: "CreateNoteList"), object: nil)// . object: nil 可以发送通知的视图接收过来

         

    }

    override func viewWillAppear(_ animated: Bool) {

        self.clearsSelectionOnViewWillAppear = self.splitViewController!.isCollapsed

        super.viewWillAppear(animated)

    }

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

    /*func insertNewObject(_ sender: Any) {

        objects.insert(NSDate(), at: 0)

        let indexPath = IndexPath(row: 0, section: 0)

        self.tableView.insertRows(at: [indexPath], with: .automatic)

    }*/

    // MARK: - Segues

    //详细页面显示

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "showDetail" {

            if let indexPath = self.tableView.indexPathForSelectedRow {

                let object = objects[indexPath.row] as! Note

                let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController

                controller.detailItem = object

                controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem

                controller.navigationItem.leftItemsSupplementBackButton = true

            }

        }

    }

    // MARK: - Table View

    override func numberOfSections(in tableView: UITableView) -> Int {

        return 1

    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return self.objects.count

    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell"for: indexPath)

        let object = objects[indexPath.row] as! Note//查询数组中的Note出来

        cell.textLabel!.text = object.Content as String//取Note的Content的属性

        return cell

    }

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        // Return false if you do not want the specified item to be editable.

        return true

    }

    //进行操作,当前主要处理delete操作

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {

            let removeNote = self.objects[indexPath.row] as? Note

            self.objects = BL.remove(model: removeNote!)

            //self.objects.remove(at: indexPath.row)

            tableView.deleteRows(at: [indexPath], with: .fade)

        else if editingStyle == .insert {

            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.

        }

    }

    //实现通知监听方法

    func CreateNoteList(notification : NSNotification) {

        let allData = notification.object as! NSMutableArray//取到投送过来对像

        self.objects = allData//拿到的数据给当前视图的变量

        self.tableView.reloadData()//重新加载当前表视图

         

    }

}

DetailViewController.swift

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

import UIKit

//详细页面显示

class DetailViewController: UIViewController {

    @IBOutlet weak var detailDescriptionLabel: UILabel!

    func configureView() {

        // Update the user interface for the detail item.

        if let detail = self.detailItem {

            if let label = self.detailDescriptionLabel {

                label.text = detail.Content as String

            }

        }

    }

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        self.configureView()

    }

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

    var detailItem: Note? {

        didSet {

            // Update the view.

            self.configureView()

        }

    }

}

AddViewController.swift

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

import UIKit

//添加备忘录

class AddViewController: UIViewController {

    let BL:NoteBL = NoteBL()

     

    @IBOutlet weak var noteTextField: UITextField! //TextField的输出口

     

    //Cancel的动作事件

    @IBAction func onCancel(_ sender: UIBarButtonItem) {

        self.dismiss(animated: true, completion: nil)//关闭模态

    }

     

    @IBAction func onSave(_ sender: UIBarButtonItem) {

         

        //实例化一个新的Note

        let note = Note(date: NSDate(), content: self.noteTextField.text! as NSString)//NSDate(),为当前日期

        //调用业务逻辑层的createNote方法,会返回添加后的所有数据

        let objs = BL.createNote(model: note)

        //注册通知,传输数据 . object: objs 把返回的所有数据投送出去

        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "CreateNoteList"), object: objs, userInfo: nil)

         

        self.dismiss(animated: true, completion: nil)//关闭模态

        self.noteTextField.resignFirstResponder()//username放弃第一响应者

    }

     

    override func viewDidLoad() {

        super.viewDidLoad()

        //注册点击事件

        self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))

    }

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

     

    //点击空白处关闭键盘方法

    func handleTap(sender: UITapGestureRecognizer) {

        if sender.state == .ended {

            self.noteTextField.resignFirstResponder()//username放弃第一响应者

        }

        sender.cancelsTouchesInView = false

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值