国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【iOS】—— 持久化

這篇具有很好參考價值的文章主要介紹了【iOS】—— 持久化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

數(shù)據(jù)持久化的目的

  • 快速展示,提升體驗
    • 已經(jīng)加載過的數(shù)據(jù),用戶下次查看時,不需要再次從網(wǎng)絡(luò)(磁盤)加載,直接展示給用戶
  • 節(jié)省用戶流量(節(jié)省服務(wù)器資源)
    • 對于較大的資源數(shù)據(jù)進行緩存,下次展示無需下載消耗流量
    • 同時降低了服務(wù)器的訪問次數(shù),節(jié)約服務(wù)器資源。
  • 離線使用
    • 用戶瀏覽過的數(shù)據(jù)無需聯(lián)網(wǎng),可以再次查看。
    • 部分功能使用解除對網(wǎng)絡(luò)的依賴。(百度離線地圖、圖書閱讀器)
    • 無網(wǎng)絡(luò)時,允許用戶進行操作,等到下次聯(lián)網(wǎng)時同步到服務(wù)端。
  • 記錄用戶操作
    • 草稿:對于用戶需要花費較大成本進行的操作,對用戶的每個步驟進行緩存,用戶中斷操作后,下次用戶操作時直接繼續(xù)上次的操作。
    • 已讀內(nèi)容標記緩存,幫助用戶識別哪些已讀。
    • 搜索記錄緩存

iOS中數(shù)據(jù)持久化方案

  • NSUserDefault 簡單數(shù)據(jù)快速讀寫
  • Property list (屬性列表)文件存儲
  • Archiver (歸檔)
  • SQLite 本地數(shù)據(jù)庫
  • CoreData

數(shù)據(jù)持久化方式分類

在移動端的數(shù)據(jù)持有化方式總體有兩類:

內(nèi)存緩存

  • 定義: 對于使用頻率比較高的數(shù)據(jù),從網(wǎng)絡(luò)或磁盤加載數(shù)據(jù)到內(nèi)存以后,使用后并不馬上銷毀,下次使用直接從內(nèi)存加載。

內(nèi)存指當前程序的運行空間,緩存速度快容量小,是臨時存儲文件用的,供CPU直接讀寫。打開一個程序,他是在內(nèi)存中存儲,關(guān)閉程序后內(nèi)存就又回到原來的空間空間。

  • 案例:
    • iOS系統(tǒng)圖片加載 —— [UIImage imageNamed:@“imageName”]
    • 網(wǎng)絡(luò)圖片加載三方庫 SDWebImage

磁盤緩存

  • 定義:將從網(wǎng)絡(luò)加載的,用戶操作產(chǎn)生的數(shù)據(jù)寫入到磁盤,用戶下次查看、繼續(xù)操作時,直接從磁盤加載使用

磁盤是程序的存儲空間,緩存容量大、速度慢、可持有化。與內(nèi)存不同的是磁盤是永久存儲東西的。

  • 案例:
    • 用戶輸入內(nèi)容草稿緩存
    • 搜索歷史緩存
    • 網(wǎng)絡(luò)圖片加載三方庫 SDWebImage

沙盒機制

每個iOS應(yīng)用都有自己的應(yīng)用沙盒,應(yīng)用沙盒就是文件系統(tǒng)目錄,與其他應(yīng)用的文件系統(tǒng)隔離, iOS系統(tǒng)不允許訪問其他應(yīng)用的應(yīng)用沙盒。在iOS8中已經(jīng)開放訪問(extension)。extension是iOS8新開放的一種對幾個固定系統(tǒng)區(qū)域的擴展機制,它可以在一定程度上彌補iOS的 沙盒機制對應(yīng)用間通信的限制。

應(yīng)用沙盒一般包括以下幾個文件目錄:應(yīng)用程序包、Documents、Libaray(下面有Caches和 Preferences目錄)、tmp。

  • 應(yīng)用程序包:包含所有的資源文件和可執(zhí)行文件。
  • Documents:保存應(yīng)用運行時生成的需要持久化的數(shù)據(jù),iTunes會自動備份該目錄。蘋果建議將程 序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下,iTunes備份和恢復的時候會包括此目 錄
  • tmp:保存應(yīng)用運行時所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒有運行 時,系統(tǒng)也有可能會清除該目錄下的文件,iTunes不會同步該目錄。iphone重啟時,該目錄下的 文件會丟失。
  • Library:存儲程序的默認設(shè)置和其他狀態(tài)信息,iTunes會自動備份該目錄。
    • Libaray/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應(yīng)用退出刪除。一 般存放體積比較大,不是特別重要的資源。
    • Libaray/Preferences:保存應(yīng)用的所有偏好設(shè)置,iOS的Settings(設(shè)置)應(yīng)用會在該目錄中查找 應(yīng)用的設(shè)置信息,iTunes會自動備份該目錄。

獲取應(yīng)用程序的沙盒路徑

// 獲取沙盒根目錄路徑
NSString *path = NSHomeDirectory();

注意: 每次編譯代碼會生成新的沙盒路徑,注意是編譯不是啟動,所以模擬機或者真機運行,每次運行所得到的沙盒路徑都是不一樣的,線上版本app真機不會生成新的沙盒路徑。

上面的代碼得到的就是當前應(yīng)用程序目錄的路徑,該目錄下就是應(yīng)用程序的沙盒,在該目錄下有4個文件夾:Documents、LibrarySystemData、tmp,當前應(yīng)用程序只能訪問該目錄下的文件。

沙盒目錄的獲取方式

//獲取沙盒根路徑
NSString *path = NSHomeDirectory();
NSLog(@"沙盒根路徑:%@", path);
//Document路徑
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"Document目錄路徑:%@", docDir);
// 獲取Library的目錄路徑
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"Libarary目錄路徑:%@", libDir);
// 獲取Caches目錄路徑
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"Cacheas目錄路徑:%@", cachesDir);
// library Preference
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSLog(@"偏好設(shè)置目錄路徑:%@", defaults);
// 獲取tmp目錄路徑
NSString *tmpDir =  NSTemporaryDirectory();
NSLog(@"tmp目錄路徑:%@", tmpDir);

輸出結(jié)果:
【iOS】—— 持久化,ios,xcode,objective-c,swift,macos

持久化數(shù)據(jù)存儲方式

XML屬性列表

屬性列表是一種XML格式的文件,拓展名為plist

如果對象是NSString、NSDictionaryNSArray、NSDataNSNumber等類型,就可以使用
writeToFile:atomically:方法直接將對象寫到屬性列表文件中,舉例說明:

    // 獲取 Document 文件目錄
    NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    // 在 Document 目錄下新建一個 test.plist 文件
    NSString * filePath = [docPath stringByAppendingPathComponent:@"test.plist"];

    // 存字典,將字典數(shù)據(jù)存到剛才的 test.plist 文件
    NSDictionary* dict = @{ @"name" :@"zxb10", @"age" : @"20" };
    [dict writeToFile:filePath atomically:YES];

    // 取字典,從剛才的 test.plist 文件中取出字典數(shù)據(jù)
    NSDictionary* dictA = [NSDictionary dictionaryWithContentsOfFile:filePath];
    NSLog(@"%@", dictA);

    // 存數(shù)組
    NSArray* array = @[@"zxb10", @"20"];
    [array writeToFile:filePath atomically:YES];

    // 取數(shù)組
    NSArray* arrayA = [NSArray arrayWithContentsOfFile:filePath];
    NSLog(@"%@", arrayA);

輸出結(jié)果:
【iOS】—— 持久化,ios,xcode,objective-c,swift,macos
我們可以在document目錄下找到這個文件:
【iOS】—— 持久化,ios,xcode,objective-c,swift,macos
因為我們最后是存儲的 NSArray 數(shù)據(jù)類型的,所以他這里也就是 NSArray 類型的數(shù)據(jù)。

Preferences偏好設(shè)置(UserDefaults)

很多iOS應(yīng)用都支持偏好設(shè)置,提供了一套標準的解決方案來為應(yīng)用加入偏好設(shè)置功能,比如保存用戶名,字體大小,密碼,是否自動登錄等。

每個應(yīng)用都有個NSUserDefaults實例,可以通過它來存取偏好設(shè)置,不需要路徑。其本身的創(chuàng)建類似于單例模式,我們在后面用不同的屬性名再次申請創(chuàng)建,會覆蓋之前的數(shù)據(jù)。

NSUserDefaults:簡單數(shù)據(jù)快速讀寫,不能存儲自定義類型。
UserDefaults設(shè)置數(shù)據(jù)時,不是立即寫入,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了。出現(xiàn)以上問題,可以通過調(diào)用synchornize方法[defaults synchornize];強制寫入。

偏好設(shè)置存儲的優(yōu)點:

  • 不需要關(guān)心文件名,系統(tǒng)會自動幫你生成一個文件名。
  • 快速做鍵值對的存儲。

我們使用UserDefaults注冊一個賬號密碼試一下:

    // 獲取偏好設(shè)置對象
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    //存儲數(shù)據(jù)
    [defaults setObject:@"zxb10" forKey:@"name"];
    [defaults setObject:@"zxbnb666" forKey:@"password"];

    // 同步調(diào)用,立刻寫到文件中,不寫這個方法會異步,有延遲
    [defaults synchronize];

    // 需要驗證賬號密碼的地方,獲取偏好設(shè)置對象
    NSUserDefaults *defaultsA = [NSUserDefaults standardUserDefaults];
    NSString *name = [defaultsA objectForKey:@"name"];
    NSString *password = [defaultsA objectForKey:@"password"];
    NSLog(@"name:%@ password:%@", name, password);

【iOS】—— 持久化,ios,xcode,objective-c,swift,macos

數(shù)據(jù)庫存儲

  • SQLite:
    是目前主流的嵌入式關(guān)系型數(shù)據(jù)庫,其最主要的特點就是輕量級、跨平臺,當前很多嵌入式操作系統(tǒng)都將其作為數(shù)據(jù)庫首選。
  • CoreData:
    CoreData是iOS5之后才出現(xiàn)的一個框架,本質(zhì)上是對SQLite的一個封裝,它提供了對象-關(guān)系映射(ORM)的功能,即能夠?qū)C對象轉(zhuǎn)化成數(shù)據(jù),保存在SQLite數(shù)據(jù)庫文件中,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成OC對象,在這個過程中不需要手動編寫任何SQL語句,CoreData封裝了數(shù)據(jù)庫的操作過程,以及數(shù)據(jù)庫中數(shù)據(jù)和OC對象的轉(zhuǎn)換過程。通過CoreData管理應(yīng)用程序的數(shù)據(jù)模型,可以極大程度減少需要編寫的代碼數(shù)量。
  • FMDB:
    是一個處理數(shù)據(jù)存儲的第三方框架,框架是對sqlite的封裝,整個框架非常輕量級但又不失靈活性,而且更加面向?qū)ο蟆?/li>

SQLiteCoreData的區(qū)別:文章來源地址http://www.zghlxwxcb.cn/news/detail-612940.html

  • CoreData可以在一個對象更新時,其關(guān)聯(lián)的對象也會隨著更新,相當于你更新一張表時,其關(guān)聯(lián)的其他表的也會隨著更新。
  • CoreData供更簡單的性能管理機制,可以限制查詢記錄的總數(shù),這個類會自動更新其緩存。
  • 多表查詢方面,CoreData沒有SQL直觀,沒有類似外連接,左連接等操作。

什么是序列化和反序列化,用來做什么?

  • 序列化:把對象轉(zhuǎn)化為字節(jié)序列的過程
  • 反序列化:把字節(jié)序列恢復成對象
  • 作用:把對象寫到文件或者數(shù)據(jù)庫中,并且讀取出來

寫入和讀取plist文件

// 其中,Show為我們plist文件的名稱,后面的plist是Show的擴展名
// 寫入plist
- (void)setDataFromPlist {
    NSString *plist = [[NSBundle mainBundle] pathForResource:@"Show" ofType:@"plist"];
    NSMutableDictionary *temp = [[NSMutableDictionary alloc] init];
    [temp setValue:@20 forKey:@"age"];
    [temp setValue:@"男" forKey:@"sex"];
    [temp writeToFile:plist atomically:YES];
}

// 讀取plist
- (void)getDataFromPlist {
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Show" ofType:@"plist"];
    NSMutableDictionary *dataDic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
    NSLog(@"%@", dataDic);//直接打印數(shù)據(jù)
}

到了這里,關(guān)于【iOS】—— 持久化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【學習iOS高質(zhì)量開發(fā)】——熟悉Objective-C

    【學習iOS高質(zhì)量開發(fā)】——熟悉Objective-C

    Objective-C和Java、C++都是面向?qū)ο笳Z言但是語法上有些許不同。OC使用“消息結(jié)構(gòu)”而不是“函數(shù)調(diào)用”,這二者的區(qū)別主要體現(xiàn)在: 使用消息結(jié)構(gòu)的語言,其運行所應(yīng)執(zhí)行的代碼由運行環(huán)境來決定;使用函數(shù)調(diào)用的語言,則由編譯器決定。OC的重要工作都是由運行期組件來完

    2024年01月19日
    瀏覽(23)
  • Redis兩種持久化方案RDB持久化和AOF持久化

    Redis兩種持久化方案RDB持久化和AOF持久化

    Redis持久化 Redis有兩種持久化方案: RDB持久化 AOF持久化 1.1.RDB持久化 RDB全稱Redis Database Backup file(Redis數(shù)據(jù)備份文件),也被叫做Redis數(shù)據(jù)快照。簡單來說就是把內(nèi)存中的所有數(shù)據(jù)都記錄到磁盤中。當Redis實例故障重啟后,從磁盤讀取快照文件,恢復數(shù)據(jù)??煺瘴募Q為RDB文件

    2024年02月14日
    瀏覽(28)
  • iOS問題記錄 - type argument ‘nw_proxy_config_t‘ is neither an Objective-C object nor a block type

    iOS問題記錄 - type argument ‘nw_proxy_config_t‘ is neither an Objective-C object nor a block type

    升級Xcode 15后,意料之中,項目又遇到了問題。 Xcode: 15.0 CocoaPods: 1.12.1 flutter_inappwebview: 6.0.0-beta.24+1 Flutter項目在Xcode 15上編譯時報錯: 從報錯信息看,是因為 nw_proxy_config_t 的類型不對導致的,錯誤發(fā)生在 flutter_inappwebview 庫用到的 WebKit.framework 中,初步猜測可能是有什么新的

    2024年02月08日
    瀏覽(26)
  • redis持久化【RDB+AOF】持久化雙雄

    redis持久化【RDB+AOF】持久化雙雄

    這是redis系列文章之《redis持久化【RDB+AOF】持久化雙雄》,上一篇文章【redis基礎(chǔ)】redis的十大數(shù)據(jù)類型_努力努力再努力mlx的博客-CSDN博客 感謝大家的支持~ 目錄 RDB 什么是RDB RDB的作用 配置文件關(guān)于RDB部分? 6vs7 操作步驟 修改配置文件(本案例設(shè)置5s修改2次) 修改dump文件的保

    2024年02月08日
    瀏覽(48)
  • RabbitMQ系列(8)--實現(xiàn)RabbitMQ隊列持久化及消息持久化

    RabbitMQ系列(8)--實現(xiàn)RabbitMQ隊列持久化及消息持久化

    概念:在上一章文章中我們演示了消費者宕機的情況下消息沒有被消費成功后會重新入隊,然后再被消費,但如何保障RabbitMQ服務(wù)停掉的情況下,生產(chǎn)者發(fā)過來的消息不會丟失,這時候我們?yōu)榱讼⒉粫G失就需要將隊列和消息都標記為持久化。 1、實現(xiàn)RabbitMQ隊列持久化 只需

    2024年02月09日
    瀏覽(22)
  • 全面解析 Redis 持久化:RDB、AOF與混合持久化

    前言: 每次你在游戲中看到玩家排行榜,或者在音樂應(yīng)用中瀏覽熱門歌單,有沒有想過這個排行榜是如何做到實時更新的?當然,依靠 Redis 即可做到。 在技術(shù)領(lǐng)域,我們經(jīng)常聽到 「鍵值存儲」 這個詞。但在 Redis 的世界里,這只是冰山一角。Redis 的對象,不僅僅是簡單的數(shù)據(jù)

    2024年03月10日
    瀏覽(34)
  • Redis 持久化-RDB和 持久化-AOF 的詳細介紹以及區(qū)別

    Redis 持久化-RDB和 持久化-AOF 的詳細介紹以及區(qū)別

    在線文檔: https://redis.io/topics/persistence RDB(Redis DataBase) AOF(Append Of File) 在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤, 也就Snapshot 快照,恢復時將快照文件讀到內(nèi)存 RDB 及其執(zhí)行流程 對上圖的解讀 具體流程如下: redis 客戶端執(zhí)行bgsave 命令或者自動觸發(fā)bgsave 命令;

    2024年02月09日
    瀏覽(32)
  • Sentinel 規(guī)則持久化

    Sentinel 規(guī)則持久化

    需要大量修改源碼,很麻煩,下面也只是修改了一小部分 阿里有一個收費的sentinel云服務(wù),開源sentinel沒有實現(xiàn)最佳版本可能就是為了給收費版讓路吧 修改OrderService,讓其監(jiān)聽Nacos中的sentinel規(guī)則配置。 具體步驟如下: 1.引入依賴 在order-service中引入sentinel監(jiān)聽nacos的依賴:

    2024年02月12日
    瀏覽(20)
  • redis的持久化

    redis的持久化

    Redis支持RDB和AOF兩種持久化機制,持久化功能有效地避免因進程退出造成的數(shù)據(jù)丟失問題,當下次重啟時利用之前持久化的文件即可實現(xiàn)數(shù)據(jù)恢復。理解掌握持久化機制對于Redis運維非常重要。 傳統(tǒng)的mysql我們是把數(shù)據(jù)存儲到硬盤中,redis的一個最重要的特點就是快,我們也會

    2024年04月12日
    瀏覽(34)
  • RabbitMQ---持久化

    RabbitMQ---持久化

    ? 如何避免消息丟失? 1) 消費者的ACK機制??梢苑乐瓜M者丟失消息。 2) 但是,如果在消費者消費之前,MQ就宕機了,消息就沒了。 ? 如何將消息進行持久化呢? 要將消息持久化,前提是:隊列、Exchange都持久化

    2024年02月11日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包