在這里具體使用到的是Django框架中的app的架構思想。做iOS開發(fā)的同學們對Django框架可能很陌生,那下面我就做一個簡單的介紹。
Django中的app的架構分成4個Python的文件,(models.py , views.py , urls.py ) 和html模板文件 (latest_books.html )。
下面是這些例子:
models.py:
# models.py (the database tables)
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=50)
pub_date = models.DateField()
這一塊是數據模塊,也就是模型模塊,主要用告述數據庫要存儲什么數據,儲存完后封裝到模型中,這比iOS的轉模型要簡單多了。
views.py:
# views.py (the business logic)
from django.shortcuts import render_to_response
from models import Book
def latest_books(request):
book_list = Book.objects.order_by('-pub_date')[:10]
return render_to_response('latest_books.html', {'book_list': book_list})
這里views不是我們理解的view做UI的布局和初始化。這里就好比我們的vm模塊,加載數據和做一些數據的邏輯。
urls.py:
# urls.py (the URL configuration)
from django.conf.urls.defaults import *
import views
urlpatterns = patterns('',
(r'^latest/$', views.latest_books),
)
urls大家一看這個很熟悉,不是我們做網絡請求中的url。其實不然這是做對接的接口,例子中是用來views對外的接口,用來溝通對應的HTML。這里的功能和Controller一樣但沒有Controller功能那么強大。
latest_books.html:
# latest_books.html (the template)
<html><head><title>Books</title></head>
<body>
<h1>Books</h1>
<ul>
{% for book in book_list %}
<li>{{ book.name }}</li>
{% endfor %}
</ul>
</body></html>
這里就是view了用來初始化UI視圖和做一些界面邏輯處理(這里一般指的是點擊觸發(fā)時間)。
上面就是簡單的介紹了models.py、views.py、urls.py、html 模板、與iOS上的模塊的對應。
這種設計模式關鍵的優(yōu)勢在于各種組件都是 松散結合 的。這樣,每個由 Django驅動 的Web應用都有著明確的目的,并且可獨立更改而不影響到其它的部分。 比如,開發(fā)者 更改一個應用程序中的 URL 而不用影響到這個程序底層的實現(xiàn)。 設計師可以改變 HTML 頁面 的樣式而不用接觸 Python 代碼。 數據庫管理員可以重新命名數據表并且只需更改一個地方,無需從一大堆文件中進行查找和替換。
那下面我就依據Django的這種設計模式和融入工廠設計模式,寫一個iOS簡單架構。

這是我寫的一個簡單架構圖,這也是一個初始版。下面我就具體將一下:
Controller是用來做整個頁面的控制器、業(yè)務邏輯的處理、頁面跳轉處理、分配任務等等,這就好比如我們的大腦。
如圖:

Controller:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
//數據請求和轉模型
[self initRequest];
//這里用tableView做例子
[self initTabelView];
}
我在Controller中就做了這兩樣事情
1.創(chuàng)建數據請求和裝模型
2.創(chuàng)建tableView
ViewModel:
這個模塊就是和Django中的views.py類似,用來做頁面邏輯的處理和數據的加載。這里也是我們這個框架的核心。
//初始化整個view的圖層
- (void)initView {
StyleView *view = [StyleView initView:CGRectMake(0, 0, UI_SCREEN_WIDTH, 100)];
[self addSubview:_styleView = view];
}
//數據邏輯(對應的給每個view數據,邏輯在這里處理)
- (void)setDataModel:(DataModel *)dataModel {
_dataModel = dataModel;
[_styleView initData:_dataModel];
}
當前還處于一個簡單的狀態(tài),雖然簡單但初步形成了初始化和業(yè)務邏輯的分層,這樣做利于我們的維護和可讀性、邏輯的清晰。
view:
這一塊就是用來做初始化頁面的,這里只做這么一件是。這里不用做過多復雜度,過于復雜就顯的可讀性差的多了。
+ (instancetype)initView:(CGRect)frame {
StyleView *view = [[StyleView alloc] initWithFrame:frame];
return view;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self initView];
}
return self;
}
//在view初始化控件,(這里就如同web開發(fā)中的thml頁面,也就是web中mvc中的view)
- (void)initView {
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, image_HW, image_HW)];
[self addSubview:_imageViews = imageView];
UILabel *nameLbl = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 100, 40)];
[self addSubview:_nameLbl = nameLbl];
UILabel *contentLbl = [[UILabel alloc] initWithFrame:CGRectMake(100, 55, UI_SCREEN_WIDTH - image_HW -10, image_HW - 55)];
[self addSubview:_contentLbl = contentLbl];
}
//這里就是這個頁面的數據導入
- (void)initData:(DataModel *)dataModel {
_imageViews.image = [UIImage imageNamed:dataModel.imageName];
_nameLbl.text = dataModel.textLbl;
_contentLbl.text = dataModel.contentLbl;
}