iOS開(kāi)發(fā)-數(shù)據(jù)持久化-2 存儲(chǔ)下載文件

沙盒機(jī)制


先介紹3個(gè)有關(guān)的文件夾,以及沙盒機(jī)制:

Documents:應(yīng)用會(huì)將數(shù)據(jù)存儲(chǔ)在這個(gè)文件夾里,但是基于NSUserDefaults 的首選項(xiàng)設(shè)置除外;

Library:基于NSUserDefaults的首選項(xiàng)設(shè)置存儲(chǔ)在 Library/Preferences 文件夾中,且Library下面有Preferences和Caches目錄;

tmp:供應(yīng)用存儲(chǔ)臨時(shí)文件,當(dāng)iOS設(shè)備進(jìn)行同步操作時(shí),iTunes并不會(huì)備份這個(gè)文件夾的文件,但是在不需要這些文件的時(shí)候,應(yīng)用需要?jiǎng)h除tmp中的這些文件,以免占用文件系統(tǒng)空間;

什么是沙盒機(jī)制?

? 我們手中的iphone/ipad設(shè)備上包含著閃存(flash memory),它的功能和一個(gè)硬盤功能等價(jià)。當(dāng)設(shè)備斷電后數(shù)據(jù)依然能夠被保存下來(lái),應(yīng)用程序可以把數(shù)據(jù)文件保存到山村上,并且讀取它們。但是,需要注意的是,我們所開(kāi)發(fā)的應(yīng)用程序是無(wú)法訪問(wèn)整個(gè)閃存的,因?yàn)殚W存上面會(huì)專門有一部分給我們,這一部分就是屬于我們開(kāi)發(fā)的整個(gè)應(yīng)用程序的沙盒(sandbox)了。iOS系統(tǒng)下,每個(gè)應(yīng)用都只能看到自己的沙盒,這就防止對(duì)其他應(yīng)用程序的數(shù)據(jù)文件進(jìn)行讀寫(xiě)活動(dòng)。就像我們的應(yīng)用程序也能夠看見(jiàn)一些系統(tǒng)擁有的高級(jí)別目錄,但是卻無(wú)法進(jìn)行任何的寫(xiě)入操作;

1、獲取Documents目錄

由于iOS中應(yīng)用的數(shù)據(jù)存儲(chǔ)是沙盒機(jī)制,因此讀取和寫(xiě)入文件,我們需要調(diào)用C函數(shù) “NSSearchPathForDirectoriesInDomains()”來(lái)查找各種目錄,(這個(gè)C函數(shù)可以基于Mac OS X平臺(tái)的Cocoa共享)

如檢索Documents目錄路徑的代碼:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *pathDirectory = [paths objectAtIndex:0];

//或者NSString *pathDirectory = [paths lastObject];

第一個(gè)常量NSDocumentDirectory表示正在查找沙盒Document目錄的路徑(如果參數(shù)為NSCachesDirectory則表示沙盒Cache目錄),第二個(gè)常量NSUserDomainMask表明我們希望將搜索限制在應(yīng)用的沙盒內(nèi);(在Mac OS X中,此常量表示我們希望該函數(shù)查看用戶的主目錄,因此才會(huì)有這個(gè)命名;)

返回的是一個(gè)數(shù)據(jù)paths,為什么位于索引0就是我們需要的Documents目錄?因?yàn)槊恳粋€(gè)應(yīng)用只有一個(gè)Documents目錄,因此只有一個(gè)目錄符合這個(gè)條件;

接下來(lái),我們可以為剛才檢索到的目錄pathDirectory的結(jié)尾加一個(gè)字符串來(lái)創(chuàng)建一個(gè)文件名,如下:

NSString *filename = [pathDirectory stringByAppendingPathComponent:@"data.txt"];

//注意是stringByAppendingPathComponent,不要拼錯(cuò)。

這個(gè)時(shí)候我們得到的filename字符串就可以進(jìn)行創(chuàng)建、讀取、寫(xiě)入文件了。


下載文件,存入沙盒文件的使用

//NSFileManager是封裝的文件存取相關(guān)方法

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

? ? NSString*documentsDirectory = [paths lastObject];

? ? NSLog(@"app_home_doc: %@",documentsDirectory);

? ? NSFileManager *fileManager = [NSFileManager defaultManager];

? ? NSString*filePath = [documentsDirectory stringByAppendingPathComponent:@"data.txt"];

? ? if([fileManager fileExistsAtPath:filePath]) {

? ? ? ? //已下載該文件

? ? }else{

? ??AFHTTPSessionManager *manage? = [AFHTTPSessionManager manager];? ?
????NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: downloadURL]];? ?
?????NSURLSessionDownloadTask *downloadTask = [manage downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
//進(jìn)度? ? ? ? ? ?
?if (downloadProgress) {? ? ? ? ? ? ? ?
?????progress(downloadProgress);? ? ? ? ? ?
?}? ? ? ?
? } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {? ? ? ? ? ?
????//獲取沙盒路徑? ? ? ? ? ?
????NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, ????NSUserDomainMask, YES) lastObject];? ? ? ? ? ?
????//拼接文件全路徑? ? ? ? ? ?
????NSString *fullpath = [caches stringByAppendingPathComponent: response.suggestedFilename];? ? ? ? ? ?
????NSURL *filePathUrl = [NSURL fileURLWithPath: fullpath];?
? ? //將下載到臨時(shí)文件的內(nèi)容,移到沙盒? ? ? ? ?
?????[FileManager moveItemAtPath:targetPath.path toPath:filePath overwrite:YES];? ? ? ? ? ?
????//下載完成,存儲(chǔ)完畢? ? ? ?
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nonnull filePath, NSError * _Nonnull error) {? ? ? ? ? ?
????if (error) {? ? ? ? ? ? ? ?
????faliure(error);? ? ? ? ? ?
????}? ? ? ? ? ?
?????if (filePath){? ? ? ? ? ? ? ?
????????destination(filePath);? ? ? ? ? ?
????}? ?
}];? ?
//啟動(dòng)任務(wù)? ?
?[downloadTask resume];

}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容