三.數(shù)據(jù)存儲
1.數(shù)據(jù)存儲技術(shù)
1>?數(shù)據(jù)存儲的幾種方式?
XML屬性列表(plist)歸檔
Preference(偏好設(shè)置)
NSKeyedArchiver歸檔(NSCoding)
SQLite3
Core Data
2>?各自特點
Plist:
屬性列表是一種XML格式的文件阶牍,拓展名為plist
如果對象是NSString冰单、NSDictionary、NSArray喝滞、NSData猴誊、NSNumber等類型潦刃,就可以使用writeToFile:atomically:方法直接將對象寫到屬性列表文件中
?將一個NSDictionary對象歸檔到一個plist屬性列表中
//?將數(shù)據(jù)封裝成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"母雞" forKey:@"name"];
//?將字典持久化到Documents/stu.plist文件中
[dict writeToFile:path atomically:YES];
面試考點:
1.??plist的根節(jié)點只能是NSDictionary和NSArray,所以存儲內(nèi)容必須轉(zhuǎn)為對象類型
2.??使用場景?功能動態(tài)更新應(yīng)用級別數(shù)據(jù)更新?XML的替代品
偏好設(shè)置:
每個應(yīng)用都有個NSUserDefaults實例懈叹,通過它來存取偏好設(shè)置
比如乖杠,保存用戶名、字體大小澄成、是否自動登錄
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"itcast" forKey:@"username"];
[defaults setFloat:18.0f forKey:@"text_size"];
[defaults setBool:YES forKey:@"auto_login"];
面試考點:
1.??使用場景保存應(yīng)用信息
2.??特點?不會自動刪除胧洒,itune同步畏吓,不適合存大數(shù)據(jù)
3.??使用單例模式、
4.??直接存取結(jié)構(gòu)體卫漫,基本數(shù)據(jù)類型菲饼,無需轉(zhuǎn)換
5.??即時操作注意同步
歸檔:
如果對象是NSString、NSDictionary汛兜、NSArray巴粪、NSData、NSNumber等類型粥谬,可以直接用NSKeyedArchiver進行歸檔和恢復(fù)
不是所有的對象都可以直接用這種方法進行歸檔肛根,只有遵守了NSCoding協(xié)議的對象才可以
NSCoding協(xié)議有2個方法:
encodeWithCoder:
每次歸檔對象時,都會調(diào)用這個方法漏策。一般在這個方法里面指定如何歸檔對象中的每個實例變量派哲,可以使用encodeObject:forKey:方法歸檔實例變量
initWithCoder:
每次從文件中恢復(fù)(解碼)對象時,都會調(diào)用這個方法掺喻。一般在這個方法里面指定如何解碼文件中的數(shù)據(jù)為對象的實例變量芭届,可以使用decodeObject:forKey方法解碼實例變量
歸檔一個NSArray對象到Documents/array.archive
NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];
[NSKeyedArchiver archiveRootObject:array toFile:path];
?使用archiveRootObject:toFile:方法可以將一個對象直接寫入到一個文件中,但有時候可能想將多個對象寫入到同一個文件中感耙,那么就要使用NSData來進行歸檔對象
??歸檔(編碼)
//?新建一塊可變數(shù)據(jù)區(qū)
NSMutableData *data = [NSMutableData data];
//?將數(shù)據(jù)區(qū)連接到一個NSKeyedArchiver對象
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
//?開始存檔對象褂乍,存檔的數(shù)據(jù)都會存儲到NSMutableData中
[archiver encodeObject:person1 forKey:@"person1"];
[archiver encodeObject:person2 forKey:@"person2"];
//?存檔完畢(一定要調(diào)用這個方法)
[archiver finishEncoding];
//?將存檔的數(shù)據(jù)寫入文件
[data writeToFile:path atomically:YES];
????恢復(fù)(解碼)
//?從文件中讀取數(shù)據(jù)
NSData *data = [NSData dataWithContentsOfFile:path];
//?根據(jù)數(shù)據(jù),解析成一個NSKeyedUnarchiver對象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
//?恢復(fù)完畢
[unarchiver finishDecoding];
利用歸檔實現(xiàn)深復(fù)制
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];
//?解析data即硼,生成一個新的Person對象
Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
?面試考點:
1.??特點:存入Document逃片,itune同步,不會自動刪除只酥,可存放大型用戶數(shù)據(jù)
2.??使用場景:用戶產(chǎn)生的數(shù)據(jù)褥实,如游戲,操作記錄等等
3.??可保存自定義對象裂允,需要遵守NSCoding協(xié)議损离,實現(xiàn)對應(yīng)的encodeWithCoder?initWithCoder?方法
4.??和NSData的配合
4.1>?多對象單目錄存儲
4.2>?字典/數(shù)組內(nèi)容的深拷貝
5.??不能直接存基本類型和結(jié)構(gòu)體,需要轉(zhuǎn)成對象?NSValue NSNumber
2>?沙盒目錄結(jié)構(gòu)
2.1> Library Caches Preferences
2.2> Documents
2.3> tmp
3>?如何讀取沙盒中plist的內(nèi)容
1>?3.1>?讀取沙盒并拼接plist的文件路徑?
??????NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil];
?3.2>?根據(jù)plist根節(jié)點類型讀取plist文件
NSArray *apps = [NSArray arrayWithContentsOfFile:path];
2.數(shù)據(jù)庫技術(shù)(SQLite&CoreData)
1> SQLite和CoreData的區(qū)別
1.1> CoreData可以在一個對象更新時,其關(guān)聯(lián)的對象也會隨著更新,相當于你更新一張表時,其關(guān)聯(lián)的其他表的也回隨著更新
1.2> CoreData提供更簡單的性能管理機制,可以限制查詢記錄的總數(shù),這個類會自動更新其緩存
1.3>?多表查詢方面,CoreData沒有SQL直觀,沒有類似外連接,左連接等操作.
iOS App升級安裝 - CoreData數(shù)據(jù)庫升級
1.選中你的mydata.xcdatamodeld文件绝编,選擇菜單editor->Add Model Version?比如取名:mydata2.xcdatamodel
2.設(shè)置當前版本
3..修改新數(shù)據(jù)模型mydata2僻澎,在新的文件上添加字段及表
4.刪除原來的類文件,重新生成下類十饥。在appdelegate中添加*optionsDictionary窟勃,原來options:nil?改成options:optionsDictionary
5.重新編譯下程序。
增加模型版本——->選擇最新的版本——->選擇表绷跑,添加字段——>刪除之前的類拳恋,重新生成。
2> iOS內(nèi)存區(qū)域
2.1>棧區(qū)
由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等.其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧.
2.2>堆區(qū)
一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時由系統(tǒng)回收
2.3>全局區(qū)(靜態(tài)區(qū))
全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量相鄰的另一塊區(qū)域.
全局區(qū)分為未初始化全局區(qū): .bss段和初始化全局區(qū): data段.
2.4>常量區(qū)
常量字符串就是放在常量區(qū)
2.5>代碼區(qū)
存放函數(shù)體的二進制代碼
3.?你是如何優(yōu)化內(nèi)存管理
1>使用ARC
2>延遲加載?懶加載?
3>重用?在正確的地方使用reuseIndentifier?
4>緩存?NSCache?保存計算數(shù)據(jù)
5>處理內(nèi)存警告?移除對緩存砸捏,圖片object?和其他一些可以重創(chuàng)建的objects?的強引用
?5.1> app delegate?中使用`applicationDidReceiveMemoryWarning:`?的方法
?5.2>?自定義UIViewController?的子類(subclass)?中覆蓋`didReceiveMemoryWarning`
?5.3>?在自定義類中注冊并接收UIApplicationDidReceiveMemoryWarningNotification?的通知
6>重用大開銷對象?NSDateFormatter?和NSCalendar?懶加載/單例?_formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy”;?設(shè)置和創(chuàng)建速度一樣慢
7>自動釋放池?手動添加自動釋放池
8>是否緩存圖片imageNamed?imageWithContentOfFile
9>混編
10>循環(huán)引用?delegate block nstimer
11>?移除kvo?nsnotificationcenter?并未強引用,只記錄內(nèi)存地址,野指針報錯?UIViewController自動移除?一般在dealloc中
13> performselector?延遲操作??[NSObject cancelPreviousPerformRequestsWithTarget:self]
4.?循環(huán)引用
delegate屬性的內(nèi)存策略
block循環(huán)引用?實際場景
5. autorelease的使用
1>工廠方法為什么不釋放對象
很多類方法為了在代碼塊結(jié)束時引用的對象不會因無強引用而被釋放內(nèi)存采用自動釋放的方式,當其最近的自動釋放池釋放時該對象才會釋放.
2> ARC下autorelease的使用場景
ARC中手動添加autoreleasepool可用于提前釋放使用自動釋放策略的對象,防止大量自動釋放的對象堆積造成內(nèi)存峰值過高.
3>自動釋放池如何工作
自動釋放池時棧結(jié)構(gòu),每個線程的runloop運行時都會自動創(chuàng)建自動釋放池,程序員可以代碼手動創(chuàng)建自動釋放池,自動釋放的對象會被添加到最近的(棧頂)自動釋放池中,系統(tǒng)自動創(chuàng)建的自動釋放池在每個運行循環(huán)結(jié)束時銷毀釋放池并給池中所有對象發(fā)release消息,手動創(chuàng)建釋放池在所在代碼塊結(jié)束時銷毀釋放池并發(fā)消息統(tǒng)一release
避免內(nèi)存峰值
SDWebimage中加載gif圖片?大循環(huán)
棧結(jié)構(gòu)棧頂
統(tǒng)一發(fā)release消息
5>ARC的實現(xiàn)原理
在程序預(yù)編譯階段,將ARC?的代碼轉(zhuǎn)換為非ARC?的代碼,自動加入release谬运、autorelease隙赁、retain
6.Runloop
1>?每個線程上都有一個runloop,主線程默認開啟,輔助線程需要手動開啟,主要用于
??使用端口或自定義輸入源來和其他線程通信
??使用線程的定時器
??Cocoa中使用任何performSelector…的方法
??使線程周期性工作
2> runloop的工作流程
7?Core Graphics繪圖的步驟:
獲取上下文(畫布)
創(chuàng)建路徑(自定義或者調(diào)用系統(tǒng)的API)并添加到上下文中。
進行繪圖內(nèi)容的設(shè)置(畫筆顏色梆暖、粗細伞访、填充區(qū)域顏色、陰影轰驳、連接點形狀等)
開始繪圖(CGContextDrawPath)
釋放路徑(CGPathRelease)?
(1)核心圖形Core Graphics是用來實現(xiàn)用戶界面視覺設(shè)計方案的重要技術(shù)框架
(2)核心動畫Core Animation提供了一套用于創(chuàng)建和渲染動態(tài)交互效果的簡單易行的解決方案,通過與UIKit的緊密配合厚掷,核心動畫可以將界面交互對象與動畫過渡效果進行完美地整合。
(3)UIkit是用來打造iOS應(yīng)用的最重要的圖形技術(shù)框架级解,它提供了用于構(gòu)造觸屏設(shè)備用戶界面的全部工具和資源冒黑,并在整個交互體驗的塑造過程中扮演著至關(guān)重要的角色
8點講動畫和layer ,view的區(qū)別
1)觸摸
2)layer?特有
3)不觸摸的替代
4)屬性
5)為什么不合二為1
6)高級用法
1.圖層與視圖
一個視圖就是在屏幕上顯示的一個矩形塊(比如圖片,文字或者視頻)勤哗,它能夠1)攔截類似于鼠標點擊或者觸摸手勢等用戶輸入抡爹。視圖在層級關(guān)系中可以互相嵌套,一個視圖可以管理它的所有子視圖的位置芒划。
所有的視圖都從一個叫做UIVIew的基類派生而來冬竟,UIView可以處理觸摸?2)(layer不行,但是layer有錨點和position的概念選裝變換的時候用),可以支持基于Core Graphics繪圖民逼,可以做仿射變換(例如旋轉(zhuǎn)或者縮放)泵殴,或者簡單的類似于滑動或者漸變的動畫。
CALayer類在概念上和UIView類似拼苍,同樣也是一些被層級關(guān)系樹管理的矩形塊笑诅,同樣也可以包含一些內(nèi)容(像圖片,文本或者背景色)映屋,管理子圖層的位置苟鸯。它們有一些方法和屬性用來做動畫和變換同蜻。和UIView最大的不同是CALayer不處理用戶的交互棚点。
CALayer并不清楚具體的響應(yīng)鏈(iOS通過視圖層級關(guān)系用來傳送觸摸事件的機制),于是它并不能夠響應(yīng)事件湾蔓,即使3)它提供了一些方法來判斷是否一個觸點在圖層的范圍之內(nèi)瘫析。
2.平行的層級關(guān)系
?4)每一個UIview都有一個CALayer實例的圖層屬性,也就是所謂的backing layer默责,視圖的職責(zé)就是創(chuàng)建并管理這個圖層贬循,以確保當子視圖在層級關(guān)系中添加或者被移除的時候,他們關(guān)聯(lián)的圖層也同樣對應(yīng)在層級關(guān)系樹當中有相同的操作桃序。
實際上這些背后關(guān)聯(lián)的圖層才是真正用來在屏幕上顯示和做動畫杖虾,UIView僅僅是對它的一個封裝,提供了一些iOS類似于處理觸摸的具體功能媒熊,以及Core Animation底層方法的高級接口奇适。
????5)但是為什么iOS要基于UIView和CALayer提供兩個平行的層級關(guān)系呢坟比?為什么不用一個簡單的層級來處理所有事情呢?原因在于要做職責(zé)分離嚷往,這樣也能避免很多重復(fù)代碼葛账。在iOS和Mac OS兩個平臺上,事件和用戶交互有很多地方的不同皮仁,基于多點觸控的用戶界面和基于鼠標鍵盤有著本質(zhì)的區(qū)別籍琳,這就是為什么iOS有UIKit和UIView,但是Mac OS有AppKit和NSView的原因贷祈。他們功能上很相似趋急,但是在實現(xiàn)上有著顯著的區(qū)別。
?繪圖势誊,布局和動畫宣谈,相比之下就是類似Mac筆記本和桌面系列一樣應(yīng)用于iPhone和iPad觸屏的概念。把這種功能的邏輯分開并應(yīng)用到獨立的Core Animation框架键科,蘋果就能夠在iOS和Mac OS之間共享代碼闻丑,使得對蘋果自己的OS開發(fā)團隊和第三方開發(fā)者去開發(fā)兩個平臺的應(yīng)用更加便捷。
????實際上勋颖,這里并不是兩個層級關(guān)系嗦嗡,而是四個,每一個都扮演不同的角色饭玲,除了視圖層級和圖層樹之外侥祭,還存在呈現(xiàn)樹和渲染樹,將在第七章“隱式動畫”和第十二章“性能調(diào)優(yōu)”分別討論茄厘。
3.圖層的能力
如果說CALayer是UIView內(nèi)部實現(xiàn)細節(jié)矮冬,那我們?yōu)槭裁匆娴亓私馑兀刻O果當然為我們提供了優(yōu)美簡潔的UIView接口次哈,那么我們是否就沒必要直接去處理Core Animation的細節(jié)了呢胎署?
????某種意義上說的確是這樣,對一些簡單的需求來說窑滞,我們確實沒必要處理CALayer琼牧,因為蘋果已經(jīng)通過UIView的高級API間接地使得動畫變得很簡單。
????但是這種簡單會不可避免地帶來一些靈活上的缺陷哀卫。如果6)你略微想在底層做一些改變巨坊,或者使用一些蘋果沒有在UIView上實現(xiàn)的接口功能,這時除了介入Core Animation底層之外別無選擇此改。
????我們已經(jīng)證實了圖層不能像視圖那樣處理觸摸事件趾撵,那么他能做哪些視圖不能做的呢?這里有一些UIView沒有暴露出來的CALayer的功能:(CALayer高級用法)
陰影共啃,圓角占调,帶顏色的邊框
3D變換
非矩形范圍
透明遮罩
多級非線性動畫
4.使用圖層
?首先我們來創(chuàng)建一個簡單的項目勋拟,來操縱一些layer的屬性。打開Xcode妈候,使用Single View Application模板創(chuàng)建一個工程敢靡。
????在屏幕中央創(chuàng)建一個小視圖(大約200 X 200的尺寸),當然你可以手工編碼苦银,或者使用Interface Builder(隨你方便)啸胧。確保你的視圖控制器要添加一個視圖的屬性以便可以直接訪問它。我們把它稱作layerView幔虏。
運行項目纺念,應(yīng)該能在淺灰色屏幕背景中看見一個白色方塊(圖1.3),如果沒看見想括,可能需要調(diào)整一下背景window或者view的顏色
8動畫?
1> ios界面切換?
2>?iOS中各種動畫的類型&特點&使用場景
CAPropertyAnimation
是CAAnimation的子類陷谱,也是個抽象類,要想創(chuàng)建動畫對象瑟蜈,應(yīng)該使用它的兩個子類:CABasicAnimation和CAKeyframeAnimation
屬性解析:
keyPath:通過指定CALayer的一個屬性名稱為keyPath(NSString類型)烟逊,并且對CALayer的這個屬性的值進行修改,達到相應(yīng)的動畫效果铺根。比如宪躯,指定@”position”為keyPath,就修改CALayer的position屬性的值位迂,以達到平移的動畫效果
CABasicAnimation
CAPropertyAnimation的子類
屬性解析:
fromValue:keyPath相應(yīng)屬性的初始值
toValue:keyPath相應(yīng)屬性的結(jié)束值
隨著動畫的進行访雪,在長度為duration的持續(xù)時間內(nèi),keyPath相應(yīng)屬性的值從fromValue漸漸地變?yōu)閠oValue
如果fillMode=kCAFillModeForwards和removedOnComletion=NO掂林,那么在動畫執(zhí)行完畢后臣缀,圖層會保持顯示動畫執(zhí)行后的狀態(tài)。但在實質(zhì)上泻帮,圖層的屬性值還是動畫執(zhí)行前的初始值精置,并沒有真正被改變。比如刑顺,CALayer的position初始值為(0,0)氯窍,CABasicAnimation的fromValue為(10,10)饲常,toValue為(100,100)蹲堂,雖然動畫執(zhí)行完畢后圖層保持在(100,100)這個位置,實質(zhì)上圖層的position還是為(0,0)
CAKeyframeAnimation
CApropertyAnimation的子類贝淤,跟CABasicAnimation的區(qū)別是:CABasicAnimation只能從一個數(shù)值(fromValue)變到另一個數(shù)值(toValue)柒竞,而CAKeyframeAnimation會使用一個NSArray保存這些數(shù)值
屬性解析:
values:就是上述的NSArray對象。里面的元素稱為”關(guān)鍵幀”(keyframe)播聪。動畫對象會在指定的時間(duration)內(nèi)朽基,依次顯示values數(shù)組中的每一個關(guān)鍵幀
path:可以設(shè)置一個CGPathRef\CGMutablePathRef,讓層跟著路徑移動布隔。path只對CALayer的anchorPoint和position起作用。如果你設(shè)置了path稼虎,那么values將被忽略
keyTimes:可以為對應(yīng)的關(guān)鍵幀指定對應(yīng)的時間點,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應(yīng)values中的每一幀.當keyTimes沒有設(shè)置的時候,各個關(guān)鍵幀的時間是平分的
CABasicAnimation可看做是最多只有2個關(guān)鍵幀的CAKeyframeAnimation
CAAnimationGroup
CAAnimation的子類衅檀,可以保存一組動畫對象,將CAAnimationGroup對象加入層后霎俩,組中所有動畫對象可以同時并發(fā)運行
屬性解析:
animations:用來保存一組動畫對象的NSArray
默認情況下哀军,一組動畫對象是同時運行的,也可以通過設(shè)置動畫對象的beginTime屬性來更改動畫的開始時間
CATransition
CAAnimation的子類打却,用于做轉(zhuǎn)場動畫杉适,能夠為層提供移出屏幕和移入屏幕的動畫效果。iOS比Mac OS X的轉(zhuǎn)場動畫效果少一點
UINavigationController就是通過CATransition實現(xiàn)了將控制器的視圖推入屏幕的動畫效果
屬性解析:
type:動畫過渡類型
subtype:動畫過渡方向
startProgress:動畫起點(在整體動畫的百分比)
endProgress:動畫終點(在整體動畫的百分比)
UIView動畫
UIKit直接將動畫集成到UIView類中柳击,當內(nèi)部的一些屬性發(fā)生改變時猿推,UIView將為這些改變提供動畫支持
執(zhí)行動畫所需要的工作由UIView類自動完成,但仍要在希望執(zhí)行動畫時通知視圖捌肴,為此需要將改變屬性的代碼放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之間
Block動畫
幀動畫
8?.網(wǎng)絡(luò)傳輸
1>DNS是如何工作的
DNS是domain name server的簡稱,每個網(wǎng)絡(luò)的計算機都有ip,但是不好記,所以用域名替代(如www.baidu.com),在Internet?上真實在辨識機器的還是IP蹬叭,所以當使用者輸入Domain Name?后,瀏覽器必須要先去一臺有Domain Name?和IP?對應(yīng)資料的主機去查詢這臺電腦的IP状知,而這臺被查詢的主機具垫,我們稱它為Domain Name Server,簡稱DNS试幽,例如:當你輸入www.pchome.com.tw時筝蚕,瀏覽器會將www.pchome.com.tw這個名字傳送到離他最近的DNS Server?去做辨識,如果查到铺坞,則會傳回這臺主機的IP起宽,進而跟它索取資料,但如果沒查到济榨,就會發(fā)生類似DNS NOT FOUND?的情形坯沪,所以一旦DNS Server當機,就像是路標完全被毀壞擒滑,沒有人知道該把資料送到那里
9?.AFN
1>實現(xiàn)原理
AFN的直接操作對象AFHTTPClient不同于ASI腐晾,是一個實現(xiàn)了NSCoding和NSCopying協(xié)議的NSObject子類。AFHTTPClient是一個封裝了一系列操作方法的“工具類”丐一,處理請求的操作類是一系列單獨的藻糖,基于NSOperation封裝的,AFURLConnectionOperation的子類库车。AFN的示例代碼中通過一個靜態(tài)方法巨柒,使用dispatch_once()的方式創(chuàng)建AFHTTPClient的共享實例,這也是官方建議的使用方法。在創(chuàng)建AFHTTPClient的初始化方法中洋满,創(chuàng)建了OperationQueue并設(shè)置一系列參數(shù)默認值晶乔。在getPath:parameters:success:failure方法中創(chuàng)建NSURLRequest,以NSURLRequest對象實例作為參數(shù)牺勾,創(chuàng)建一個NSOperation正罢,并加入在初始化發(fā)方中創(chuàng)建的NSOperationQueue。以上操作都是在主線程中完成的驻民。在NSOperation的start方法中腺怯,以此前創(chuàng)建的NSURLRequest對象為參數(shù)創(chuàng)建NSURLConnection并開啟連結(jié)。
2>?傳遞指針如何使一個方法返回多個返回值
傳參指針變量的地址,方法內(nèi)部通過*運算符使用該地址可以修改該地址保存的內(nèi)容(引用對象的地址),當外部再次使用該指針變量取出引用對象時,引用對象已經(jīng)在方法內(nèi)部發(fā)生了改變,指針變量指向其他數(shù)據(jù),相當于方法的返回值(經(jīng)方法處理后生成的外部可使用的結(jié)果數(shù)據(jù)).
9?AFNetworking&ASIHttpRequest&MKNetWorking
1川无、AFN的底層實現(xiàn)基于OC的NSURLConnection和NSURLSession
2呛占、ASI的底層實現(xiàn)基于純C語言的CFNetwork框架
3、因為NSURLConnection和NSURLSession是在CFNetwork之上的一層封裝懦趋,因此ASI的運行性能高于AFN
二晾虑、對服務(wù)器返回的數(shù)據(jù)處理
1、ASI沒有直接提供對服務(wù)器數(shù)據(jù)處理的方式仅叫,直接返回的是NSData/NSString
2帜篇、AFN提供了多種對服務(wù)器數(shù)據(jù)處理的方式
(1)JSON處理-直接返回NSDictionary或者NSArray
(2)XML處理-返回的是xml類型數(shù)據(jù),需對其進行解析
(3)其他類型數(shù)據(jù)處理
三诫咱、監(jiān)聽請求過程
1笙隙、AFN提供了success和failure兩個block來監(jiān)聽請求的過程(只能監(jiān)聽成功和失敗)
* success :?請求成功后調(diào)用
* failure :?請求失敗后調(diào)用
2坎缭、ASI提供了3套方案竟痰,每一套方案都能監(jiān)聽請求的完整過程
(監(jiān)聽請求開始、接收到響應(yīng)頭信息掏呼、接受到具體數(shù)據(jù)坏快、接受完畢、請求失斣饕摹)
* 成為代理莽鸿,遵守協(xié)議,實現(xiàn)協(xié)議中的代理方法
* 成為代理拾给,不遵守協(xié)議祥得,自定義代理方法
* 設(shè)置block
四、在文件下載和文件上傳的使用難易度
1蒋得、AFN
*不容易實現(xiàn)監(jiān)聽下載進度和上傳進度
*不容易實現(xiàn)斷點續(xù)傳
*一般只用來下載不大的文件
2级及、ASI(ipv6)
*非常容易實現(xiàn)下載和上傳
*非常容易監(jiān)聽下載進度和上傳進度
*非常容易實現(xiàn)斷點續(xù)傳
*下載大文件或小文件均可
3掺栅、實現(xiàn)下載上傳推薦使用ASI
五奏属、網(wǎng)絡(luò)監(jiān)控
1、AFN自己封裝了網(wǎng)絡(luò)監(jiān)控類皆串,易使用
2入偷、ASI使用的是Reachability追驴,因為使用CocoaPods下載ASI時,會同步下載Reachability疏之,但Reachability作為網(wǎng)絡(luò)監(jiān)控使用較為復(fù)雜(相對于AFN的網(wǎng)絡(luò)監(jiān)控類來說)
3殿雪、推薦使用AFN做網(wǎng)絡(luò)監(jiān)控-AFNetworkReachabilityManager
六、ASI提供的其他實用功能
1锋爪、控制信號旁邊的圈圈要不要在請求過程中轉(zhuǎn)
2丙曙、可以輕松地設(shè)置請求之間的依賴:每一個請求都是一個NSOperation對象
3、可以統(tǒng)一管理所有請求(還專門提供了一個叫做ASINetworkQueue來管理所有的請求對象)
* 暫停/恢復(fù)/取消所有的請求
* 監(jiān)聽整個隊列中所有請求的下載進度和上傳進度
MKNetworkKit?是一個使用十分方便其骄,功能又十分強大亏镰、完整的iOS網(wǎng)絡(luò)編程代碼庫。它只有兩個類, 它的目標是使用像AFNetworking這么簡單拯爽,而功能像ASIHTTPRequest(已經(jīng)停止維護)那么強大索抓。它除了擁有?AFNetworking和ASIHTTPRequest所有功能以外,還有一些新特色毯炮,包括:
?1逼肯、高度的輕量級,僅僅只有2個主類
?2桃煎、自主操作多個網(wǎng)絡(luò)請求
?3篮幢、更加準確的顯示網(wǎng)絡(luò)活動指標
?4、自動設(shè)置網(wǎng)絡(luò)速度为迈,實現(xiàn)自動的2G三椿、3G、wifi切換
?5葫辐、自動緩沖技術(shù)的完美應(yīng)用赋续,實現(xiàn)網(wǎng)絡(luò)操作記憶功能,當你掉線了又上線后另患,會繼續(xù)執(zhí)行未完成的網(wǎng)絡(luò)請求
?6纽乱、可以實現(xiàn)網(wǎng)絡(luò)請求的暫停功能
?7、準確無誤的成功執(zhí)行一次網(wǎng)絡(luò)請求昆箕,摒棄后臺的多次請求浪費
?8鸦列、支持圖片緩沖
?9、支持ARC機制
?10鹏倘、在整個app中可以只用一個隊列(queue)薯嗤,隊列的大小可以自動調(diào)整
10.性能優(yōu)化
1>?如何進行性能優(yōu)化
1.1>?內(nèi)存優(yōu)化的點?重用?懶加載
1.2>?渲染優(yōu)化?盡量使用不透明的圖?把views?設(shè)置為透明
1.3>?在ImageView設(shè)置前,盡量先調(diào)整好圖片大小?尤其放在uiscrolliview中自動縮放耗能
1.4>?避免使用過大的xib?和分鏡的區(qū)別?一次性加載
1.5>?不要阻塞主線程?除渲染,觸摸響應(yīng)等?盡量異步處理?如存儲,網(wǎng)絡(luò)?異步線程通知?
1.6>?緩存?網(wǎng)絡(luò)響應(yīng),圖片,計算結(jié)果(行高)?網(wǎng)絡(luò)響應(yīng)NSUrlconnection默認緩存request,設(shè)置策略?非網(wǎng)絡(luò)請求使用nscache nsdictionary
1.7>?避免反復(fù)處理數(shù)據(jù)?在服務(wù)器端和客戶端使用相同的數(shù)據(jù)結(jié)構(gòu)
1.8>?選擇正確的數(shù)據(jù)格式?json?速度快解析方便?xml?sax方式逐行解析解析大文件不占用內(nèi)存和損失性能
1.9>?優(yōu)化tableview?重用cell?緩存行高cell子視圖盡量少且不透明?
1.10>?選擇正確的數(shù)據(jù)存儲選項?plist nscoding NSUserDefaults sqlite coredata
?