本文能夠觸及很多系統的知識點,其中包括IOS使用開發的相關根底知識。當前會針對每個條目在停止深化研討,這裡只是先做一個相關知識的概述總結。
IOS的數據存儲大少數IOS順序其功用總結為:提供一套界面,協助用戶管理特定數據。在這個進程中,不同對象各司其職:模型對象擔任保管數據,視圖對象擔任顯示數據,控制器對象擔任在模型對象與視圖對象之間同步數據。
固化和解固由iOS SDK提供的一種保管和讀取對象的機制。固化某個對象的時分,會將其一切屬性存入指定的文件中。解固某個對象時,會從指定的文件讀取相應的數據,然後依據數據復原對象。
為了固化和解固某個對象,必需要恪守NSCoding協議,並且完成兩個必需辦法:encodeWithCoder辦法:和initWithCoder:辦法。
-(void)encodeWithCoder:(NSCode *)aCoder{
[aCoder encodeObject:self.itemName forKey:@"itemName"];
}
-(instancetype) initWithCoder:(NSCoder *)aDecoder{
self = [super init];
if(self){
_itermName = [aDecoderdecodeObjectForKey:@"itemName"];
}
}
寄存途徑
iOS使用可以在運轉時載入使用順序包中的文件。要取得使用順序包中的某個文件的全途徑,需求首先失掉代表使用順序包的NSBundle對象,然後經過該對象失掉某個文件的全途徑,代碼如下:
NSBundle *applicationBundle = [NSBundle mainBundle];
NSString *path = [applicationBundle pathForResource:@"myImage" ofType:@"png"];
假如使用順序需求保管順序參數、選項相關的大批數據,則可以運用NSUserDefaults停止保管;假如使用順序只要大批數據需求保管,那麼運用屬性列表就可以了;假如使用順序有少量數據停止存儲、訪問,就需求借助於數據庫了。iOS內置SQLite數據庫是一個真正輕量級的數據庫,他沒有後台順序,整個數據庫對應一個文件。並有兩套API:基於c言語作風的libSQLite3.dylib和面向對象的Core Data。
使用順序沙盒目錄 1. Document:除了基於NSUserDefaults的首選項設置之外,使用順序的數據、文件都保管在該目錄下
2. Library:基於NSUserDefaults的首選項參數保管在Library/Preference目錄下。
3. Library/Caches:寄存運轉時生成的保存數據。iTunes或許iClound不會同步該數據。
4. Library/Preferences: 寄存一切偏好數據。可以運用NSUserDefaults類
5. tmp:該目錄提供給用順序存儲的歷史文件,當iOS執行同步的時分,iTunes不會備份tmp目錄下的文件。
因而當使用順序不在需求某個暫時文件時,應該擔任刪除tmp目錄下的暫時文件,防止占用零碎空間。運轉時的暫時文件。
保管、讀取數據
後面引見了固化的寄存途徑,上面要講的是:1.如何保管、讀取數據;2.何時保管、讀取數據
保管經過 NSKeyedArchiver類保管對象發送archiveRootObject:toFile:音訊
-(BOOL)saveChagne
{
NSString *path = [self itemArchivePath];
return [NSKeyedArchiver archiveRootObject:self.privateItems toFile :path];
}
下面的任務原理是:
1. archiveRootObject:toFile:會先創立一個NSKeyedArchiver對象。
2. 然後,archiveRootObject:toFile:會向privateItems發送encodeWithCoder:音訊,並傳入NSKeyedArchiver對象作為第一個參數。
3. privateItems的encodewithCoder:辦法會向其包括的多個對象一次發送encodeWithCoder音訊,
並傳入NSKeyedArchiver對象。這項BNRItem對象都會將其屬性編碼至同一個NSKeyedArchiver對象。
4. 當一切的對象都完成編碼後,NSKeyedArchiver對象就會將數據寫入指定的文件中。
何時保管
普通狀況是在用戶按下設備的主屏幕按鈕後,AppDelegate對象會收到applicationDidEnterBackground:音訊之後,發送saveChange音訊;
讀取次要運用NSKeyedUnarchiver類。
-(instancetype)initPrivate
{
self = [super init];
NSString *psth = [self itemArchivePath];
_privateItems = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if(!_privateItems){
_privateItems = [[NSMutableArray alloc] init];
}
return self;
}
iOS多線程
iOS大致提供了如下三種多線程編程技術。
1. NSThread完成多線程。
2. NSOperation與NSOperationQueue完成多線程。
3. 運用GCD(Grand Central Dispatch)完成多線程。
NSThread的一些辦法
創立一個新線程對象。
- initWithtarget:selector:object:
創立並啟動新線程。
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)arg;
下面兩種辦法的實質都是將target對象的selector辦法轉化為線程執行體,其中selector辦法最多可以承受一個參數,而arg就代表創個selector辦法的參數。
*currentThread 屬性前往以後正在執行的線程對象。
除此之外,可以經過setName:辦法為線程設置名字,也可以經過name辦法前往指定線程的名字。
備注:啟動線程運用start辦法,線程啟動之後並不是立刻進入運轉形態,線程內啟動後處於就緒形態,當零碎調度線程後, 線程才會進入運轉形態。
假如順序希望子線程的start後立即執行,順序可以運用NSThread sleepForTimeInterval:0.001讓以後運轉的線程睡眠1毫秒。
1. 線程正常完畢。
2. 線程執行進程中呈現錯誤。
3. 直接調用NSThread的exit辦法,來終止以後正在執行的線程。
在iOS規則中,只能在UI線程中修正UI控件的屬性。所以當子線程執行“義務”完成後,假如需求經過UI控件來顯示子線程中的數據,則通常會調用performSelectorOnMainThread:withObject:waitUntilDone:辦法完成。
線程的同步與線程的通訊 線程同步:1.@synchronize完成同步。被@synchronize修飾的代碼塊可簡稱同步代碼塊。格式如下:
@synchronize(obj)
{
...
//同步代碼塊。obj就是同步監視器。經過是能夠被並發訪問的共享資源充任同步監視器。
}
Foundation框架中很多類都有可變和不可變兩種版本,比方NSString, NSArray都是不可變,他們永遠是線程平安的。但是NSMutableString,NSMutaleArray就是可變得,線程不平安的。
釋放對同步監視器的鎖定: 1. 塊執行完畢;
2. return、goto等語句完畢代碼塊。
3. 呈現錯誤、異常等。但是sleep不會釋放監視器。
同步鎖:NSLock
先取得NSLock對象實例,然後
[lock lock]
......
[lock unlock];
NSCondition控制線程通訊
雖然線程在零碎內運轉時,線程的調度具有一定的通明性,順序通常無法精確的控制線程輪換執行,但我們可以經過一些機制來保證線程協調運轉,也就是處置線程之間的通訊。
Foundation提供了一個NSCondition類來處置線程通訊,NSCondition完成了NSLocking協議,因而也可以調用lock、unlock來完成線程同步。NSCondition可以讓那些曾經鎖定NSCondition對象卻無法持續執行的線程釋放NSCondition對象,NSCondition對象也可以喚醒其他處於等候形態的線程。
次要是三個函數:
-wait:招致以後不斷等候,直到其他線程調用該NSCondition的signal或許broadcaset辦法來喚醒該線程。
-signal:喚醒再次NSCondition對象等候的單個線程。假如線程都在該NSCondition對象等候,則會選擇性喚醒其中一個線程。
-broadcast:喚醒在此NSCondition對象等候的一切線程。
運用GCD完成多線程。
GCD的兩個中心概念:
1.隊列:隊列擔任管理開發者提交的義務
2.義務:義務就是用戶提交給隊列的任務單位,這些義務提交給隊列底層維護的線程池執行,因而這些義務會以多線程的方式執行。
次要是兩個步驟:
1.創立隊列。
2.將義務提交給隊列。
創立隊列函數:
dispatch_queue_t dispatch_get_current_queue(void);
dispatch_queue_t dispatch_get_global_queue(long identifier, <#unsigned long flags#>)
…..其他詳細的參考開發文檔
NSOperation與NSOperationQueue完成多線程。 根本實際:NSOperationQueue:代表一個FIFO的隊列,它擔任管理零碎提交的多個NSOperation,NSOperationQueue底層維護一個線程池,會依照順序啟動線程來執行提交給該隊列的NSOperation義務。
NSOperation:代表一個多線程義務。NSOperation有兩個子類:1.NSInvocationOperation、NSBlockOperation。開發者會自己完成子類,也可以直接運用該子類。
步驟:1.創立NSOperationQueue隊列,病設置相關屬性。
2.創立NSOperation子類對象,並將該對象提交給NSOperationQueue隊列,該隊列將會依照一次啟動每個NSOperation義務。
【iOS使用開發根底(四)根底知識(數據存儲和多線程)】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!