你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS使用開發根底(四)根底知識(數據存儲和多線程)

iOS使用開發根底(四)根底知識(數據存儲和多線程)

編輯:IOS開發綜合

本文能夠觸及很多系統的知識點,其中包括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使用開發根底(四)根底知識(數據存儲和多線程)】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved