在程序設(shè)計中,我們經(jīng)常會使用 懶加載 ,顧名思義,就是用到的時候再開辟空間,比如iOS開發(fā)中的最常用控件UITableView,實現(xiàn)數(shù)據(jù)源方法的時候,通常我們都會這樣寫Objective-C- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataArray.count; }- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ //1.得到cell XWShopCell *cell = [XWShopCell cellWithTableView:tableView]; //2.傳遞模型 cell.wine = self.dataArray[indexPath.row]; //3.回傳cell return cell; }上面的的代碼中return self.dataArray.count;其實就是利用@property (nonatomic, strong) NSArray *dataArray;@property 的特性,為屬性生成了get和set方法,而這里是調(diào)用的get方法,但是上述代碼中return self.dataArray.count 會調(diào)用- (NSArray *)dataArray{ return _dataArray}這樣調(diào)用,如果成員屬性dataArray 開始沒有賦值的,那么在使用的時候,調(diào)用get方法,不重寫的話,會報錯,空指針,所以一般我們會重寫get方法//重寫get方法 - (NSArray *)dataArray { if (nil == _dataArray){ _dataArray = [NSArray array]; } return _dataArray }這樣寫,就防止了成員屬性為沒有賦值的情況綜上所述,Objective-C的懶加載,其實就是調(diào)用成員屬性的get方法,初始化值,而Swift的懶加載,是和Objective-C不同的Swift//MARK tablview的 dataSource 代理方法 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) - Int{ return self.dataArray.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - UITableViewCell{ //1.得到cell let cell = XWShopCell.cellWithTableView(tableView) //2.傳遞模型 cell.wine = self.dataArray[indexPath.row] //3.回傳cell return cell }而這句return self.dataArray.count在Swift 存儲屬性必須初始化,確認類型,或者用可選類型,總之要確認類型,畢竟Swfit是類型安全語言,所以Swift提出了lazy屬性,用法//1.分析 NSArray 是一個閉包的返回值,而這是一個沒有參數(shù)的閉包 lazy var dataArray:NSArray = { [] }() //2.也可以寫成這樣 lazy var dataArray:NSArray = { return NSArray() }()//3.從plist文件加載 lazy var dataArray:ArrayXWWine = { let winePath = NSBundle.mainBundle().pathForResource("wine.plist", ofType: nil)! let winesM = NSMutableArray(contentsOfFile: winePath); var tmpArray:ArrayXWWine! = [] for tmpWineDict in winesM! { var wine:XWWine = XWWine.wineWithDict(tmpWineDict as! NSDictionary) tmpArray.append(wine) } print("我就運行一次") return tmpArray }()上述的代碼,有點難理解,如果之前會Objective-C的block 或者對C語言的函數(shù)指針理解透徹的,可以看成是一個代碼塊,然后self.dataArray的時候,就執(zhí)行了代碼塊,但是重復(fù)調(diào)用,Lazy 屬性的代碼塊只會調(diào)用一次,lazy修飾的是一個存儲屬性,而存放的是閉包,我想內(nèi)部,應(yīng)該進行了優(yōu)化。
創(chuàng)新互聯(lián)建站專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、崖州網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、商城建設(shè)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為崖州等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
1.準(zhǔn)備一張指南針的圖片(下面圖片可以使用)
2.導(dǎo)入CoreLocation框架以及對應(yīng)的主頭文件 并且設(shè)置代理
3.懶加載創(chuàng)建CLLocationManager對象并設(shè)置代理
4. 調(diào)用方法, 開始獲取設(shè)備朝向? ?
5. 在對應(yīng)的代理方法中獲取設(shè)備朝向信息
記錄一下swift的懶加載?
OC回顧懶加載
- (UIButton *)but{
if (!_but){
_but = [UIButton buttonWithType:UIButtonTypeCustom];
[_but setTitle:@"寶貝" forState:UIControlStateNormal];
}
return _but;
}
下面來看swift怎么創(chuàng)建懶加載用到關(guān)鍵字lazy
swift有兩種加載方法
第一種方式
lazy var butt = UIButton()
第二種方式可以設(shè)置更多的屬性
lazy var but:UIButton ={
let but =UIButton()
but.setTitle("按鈕", for: .normal)
return but
}()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
print(but)
}
總結(jié):用到的時候再加載,多次用到只加載一次,swift里用lazy關(guān)鍵字創(chuàng)建懶加載
鏈接:
這個控件包含兩個部分:
相信大家都知道iOS原生的UIPageViewController,用它可以實現(xiàn)橫向翻頁的效果,TWPageViewController(可以在[這里][1]看到源碼)同樣也是用來實現(xiàn)橫向翻頁的效果,配合TWPageTitleViewController使用,可以實現(xiàn)類似于騰訊新聞、今日頭條這樣的app的效果。如下圖所示:
在新功能開發(fā)中,其實也考慮過使用系統(tǒng)的UIPageViewController,但是UIPageViewController有如下的缺點:
主要還是因為UIPageViewController不支持懶加載,所以才打算自己動手寫一個類似UIPageViewController的控件。
其實實現(xiàn)起來,原理是很簡單的,基于UIScrollView去開發(fā)就行了,只不過需要細心的處理好子Controller的生命周期,比如:什么時候調(diào)用viewWillAppear:,什么時候調(diào)用viewWillDisappear:等。
TWPageViewController實現(xiàn)了以下幾個特性:
以子Controller的class做key,放入復(fù)用池,下回加載同類型的viewcontroller則從復(fù)用池里面取去來,每種類型的viewcontroller會緩存一個。這樣省去了開辟viewcontroller的內(nèi)存以及cpu的消耗。如果復(fù)用池沒有相應(yīng)類型的viewcontroller則會創(chuàng)建一個。在實際應(yīng)用中可以將UI部分以及數(shù)據(jù)部分剝離開來,UI部分復(fù)用,而數(shù)據(jù)部分緩存起來,一遍下回直接加載。
在滾動停止以后(其實就是在scrollViewDidEndDecelerating:中去調(diào)用加載子Controller的回調(diào)函數(shù))才會去加載ViewController。以保證快速滑動過程的流暢,同時可以免去過程中的其他操作的資源消耗(比如途中的子Controller的網(wǎng)絡(luò)請求)。
如果子Controller的數(shù)目大于3,則內(nèi)存中只會保存3+N個viewController,3表示前一個、當(dāng)前、后一個子Controller,N等于viewController類型的數(shù)目。小于等于3就等于實際的子Controller的數(shù)目。
比如向左拖拽不放的情況下,當(dāng)前子Controller的viewWillDisappear:會被回調(diào),同時會回調(diào)下一個子Controller的viewWillAppear:,停下后,如果是停留在下一個子Controller,那么它的viewDidAppear:會被回調(diào),同時上一個的viewDidDisappear:會被回調(diào)。
這些回調(diào)有:
如果發(fā)現(xiàn)有任何問題,麻煩指出,我會及時修正,同時需要查看完整實現(xiàn)以及Demo,請點擊[這里][1]。
[1]:
在程序設(shè)計中,我們經(jīng)常會使用 懶加載 ,顧名思義,就是用到的時候再開辟空間,比如iOS開發(fā)中的最常用控件UITableView,實現(xiàn)數(shù)據(jù)源方法的時候,通常我們都會這樣寫
Objective-C
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//1.得到cell
XWShopCell *cell = [XWShopCell cellWithTableView:tableView];
//2.傳遞模型
cell.wine = self.dataArray[indexPath.row];
//3.回傳cell
return cell;
}
上面的的代碼中
return self.dataArray.count;
其實就是利用
@property (nonatomic, strong) NSArray *dataArray;
@property 的特性,為屬性生成了get和set方法,而這里是調(diào)用的get方法,但是上述代碼中return self.dataArray.count 會調(diào)用
- (NSArray *)dataArray{ return _dataArray}
這樣調(diào)用,如果成員屬性dataArray 開始沒有賦值的,那么在使用的時候,調(diào)用get方法,不重寫的話,會報錯,空指針,所以一般我們會重寫get方法
//重寫get方法
- (NSArray *)dataArray
{
if (nil == _dataArray){
_dataArray = [NSArray array];
}
return _dataArray
}
這樣寫,就防止了成員屬性為沒有賦值的情況
綜上所述,Objective-C的懶加載,其實就是調(diào)用成員屬性的get方法,初始化值,而Swift的懶加載,是和Objective-C不同的
Swift
//MARK tablview的 dataSource 代理方法
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) - Int{
return self.dataArray.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - UITableViewCell{
//1.得到cell
let cell = XWShopCell.cellWithTableView(tableView)
//2.傳遞模型
cell.wine = self.dataArray[indexPath.row]
//3.回傳cell
return cell
}
而這句
return self.dataArray.count
在Swift 存儲屬性必須初始化,確認類型,或者用可選類型,總之要確認類型,畢竟Swfit是類型安全語言,所以Swift提出了lazy屬性,用法
//1.分析 NSArray 是一個閉包的返回值,而這是一個沒有參數(shù)的閉包
lazy var dataArray:NSArray = { [] }()
//2.也可以寫成這樣 lazy var dataArray:NSArray = { return NSArray() }()
//3.從plist文件加載
lazy var dataArray:ArrayXWWine = {
let winePath = NSBundle.mainBundle().pathForResource("wine.plist", ofType: nil)!
let winesM = NSMutableArray(contentsOfFile: winePath);
var tmpArray:ArrayXWWine! = []
for tmpWineDict in winesM! {
var wine:XWWine = XWWine.wineWithDict(tmpWineDict as! NSDictionary)
tmpArray.append(wine)
}
print("我就運行一次")
return tmpArray }()
上述的代碼,有點難理解,如果之前會Objective-C的block 或者對C語言的函數(shù)指針理解透徹的,可以看成是一個代碼塊,然后self.dataArray的時候,就執(zhí)行了代碼塊,但是重復(fù)調(diào)用,Lazy 屬性的代碼塊只會調(diào)用一次,lazy修飾的是一個存儲屬性,而存放的是閉包,我想內(nèi)部,應(yīng)該進行了優(yōu)化。