沙盒本地數據化

model : 1 .怎麼來的  2: 放在哪 3: 怎麼用是一個好的方式

數據本地化 : 1: 什麼事沙河,沙河都有哪些文件夾,作用是什麼.
                      2: 什麼事數據本地化,什麼時候使用
                     3: 如何把一個數組,字典,字符串,NSData放入本地
                     4: 如何把一個Person對象存入本地

                     NSFileManger  NSFileHandle(瞭解就行) ;


                                           沙盒機制


——————————————沙盒
沙盒 : 每個iOS應用程序都會爲自己創建一個文件系統目錄(文件夾),這個獨立,封閉,安全的空間 ,叫做沙盒 
注意: 1: 每一個應用程序都會擁有一個應用程序沙盒 
         2: 應用程序沙盒就是一個系統目錄 
        獨立:  不可能出現兩個程序公用同一個沙盒
       封閉 : 每一個沙盒 都只能他自己的應用去使用
      安全 :沙盒   有被刪除的失效

手動自動存入東西 

——————————————文件夾
文件夾
  • Documents :  1: 存入一些永遠不被刪除的文件(不會被系統主動刪除),itunes備份時,同時也會備份Documents文件(條件: 儘量不在Documents放入音頻視頻等太大的東西,只放一些重要文件,以免審覈被拒) 注 :可以存,有方法讓什麼

  • Library :    1 Caches : 存儲緩存的文件夾  當用戶對某一個URL做請求操作的時候,這個URL裏面的東西會保存在主機裏面的某個位置 . Cookie 和Session . (itunes不會備份此目錄,文件不會再應用退出時刪除,一般存放比較大,不是特別重要的資源)
       
                         2: Preferences  保存應用的所有偏好設置.iOS的Settings(設置) 應用會該目錄中查找應用的設置信息,iTunes會備份它,  注意: 不應該直接創建偏好設置文件,而是應該使用類來取得和設置應用程序的偏好 
                     
  • tmp : 保存應用運行時所需的臨時數據,使用完畢後會將相應的文件從該目錄刪除.應用沒有運行時或者手機重啓時 ,系統也有可能會清除該目錄下的文件,iTunes 不會同步該目錄

獲取文件夾方法 
  •        第一種 :  通過該NSSeach搜索文件夾得地址,能獲取Documents 和Library 內部文件夾地址, 但是不能獲取tmp文件夾得地址,其他的都可以獲取到.

       //NSDocumentDirectory 表示獲取Documents文件夾得地址
   
//NSLibraryDirectory / NSCachesDirectory
   
//NSUserDomainMask  表示用戶的主目錄
   
//第三個參數表示 展開"~" 的地址,設置爲YES 爲完整路徑
   
//NSSearchPathForDirectoriesInDomains獲取的是一個數組(NSArray<NSString *> *),數組只有一個元素,所以可以直接獲取objectAtIndex: 0 ;
   
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    NSLog(@"%@",documentPathStr);
  •       第二種  : 首先獲取沙盒主路徑的地址,然後拼接上想要去的文件夾的地址.
    
    //首先獲取沙盒主路徑的地址
   
NSString *homePathStr = NSHomeDirectory();
   
NSLog(@"homePathStr = %@",homePathStr);
   
//其次: 在沙盒主路徑後拼接Documents,拼接出來documents文件夾的路徑
   
NSString *documentsPathStr = [homePathStr stringByAppendingPathComponent:@"Library/Caches"];
   
NSLog(@"documents = %@",documentsPathStr);
   
//獲取tmp文件夾得路徑
   
NSString *tmpPathStr = NSTemporaryDirectory();
    NSLog(@"tmpPathStr = %@",tmpPathStr);




               簡單對象的寫入與讀寫



——————————————數據本地化
      把數據的,存儲到應用程序的沙盒裏面
  •    寫入
    //1 . 要知道存到哪裏 ,So需要一個文件夾的路徑
   
NSString *documentsPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
   
NSLog(@"%@",documentsPathStr);
   
//2 . 知道要存什麼 創建數據
   
NSString *str = @"hello world";
   
//3 . 要知道數據放哪裏 , 創建一個路徑,路徑的終點局勢存數據的文件 Component(成分)
   
NSString *strPath = [documentsPathStr stringByAppendingPathComponent:@"str.txt"];
   
//4 . 寫入操作
   
// atomically : YES 正當手機沒電關機 會保存文件
   
//              NO  
   
// encoding : 編碼方式
    [str
writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
   
  •  讀取
    //通過路徑讀取數據,使用stringWithContentsOfFile方法,在讀取的時候,第一個參數表示讀取文件的路徑,第二個參數表示編碼格式,第三個表示錯誤信息.
    NSString *newStr = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil];


——————————————NSData
    /*
   
根據imageName獲取圖片:會在緩存裏存一份,下次在獲取同名圖片,直接從緩存裏取. 優點 : ,只有第一次的時候慢 ,但是之後再獲取的話會很快.    缺點 : 會浪費內存, 如果只用致辭的話這塊內存就浪費掉了.
   
根據ContentsOfFile獲取到的圖片: 每次都會根據路徑去取圖片,不會佔用內存.如果圖片只使用一次,推薦使用ContentsOfFile
    UIImage *image1 = [UIImage imageNamed:<#(nonnull NSString *)#>];
    UIImage *image2 = [UIImage alloc]initWithContentsOfFile:<#(nonnull NSString *)#>];
   
   
     123.png
     [email protected]
     [email protected]
    
     2x3x,表示分辨率區別
    // png類型圖片,只寫名字就行了  寫全png類型就指定了 
     */
  • 寫入
    //1
    NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    //2
    UIImage *image = [UIImage imageNamed:@"123"]; 
    //UIImage類型對象轉化成NSData類型的
    //第一個參數 :轉哪個UIImage類型對象
    //第二個參數:壓縮係數,越小壓縮越厲害
    NSData *data =UIImageJPEGRepresentation(image, 1); 
    //3
    NSString *stringPath = [documentPathStr stringByAppendingPathComponent:@"stringPath.txt" ];
    //4
    [data  writeToFile:stringPath atomically:YES];
    
  • 讀取數據
    NSData *newData = [NSData dataWithContentsOfFile:stringPath];
   
UIImage *newImage = [UIImage imageWithData:newData];
   
UIImageView *newImageView = [[UIImageView alloc]initWithImage:newImage];
    [self.view addSubview:newImageView];




                                  複雜對象的寫入與讀取

             
 什麼是複雜對象?  
     在Foundation框架內不存在的數據類,如自定義Person類等 無法在程序內通過writeToFile: 這個方法寫入文件內
     只能通過將負載對象轉化爲NSData,即歸檔

 
——————————————歸解檔

             
#import <Foundation/Foundation.h>
// 如果一個對象向直接寫入本地,那麼這個對象需要遵守NSCoding協議
@interface Person : NSObject<NSCoding>

@property(nonatomic,copy)NSString * name;

@property(nonatomic,copy)NSString * gender;

@property(nonatomic,assign)NSUInteger  age;

//nonatomic assign copy atomic weak strong readonly readwrite writeonly nonnull nullable retain unsafe_unretained

//_+屬性名 命名的成員變量
//
@end

                   
#import "Person.h"

@implementation Person

//歸檔
//在歸檔和解檔的時候,要把所有的屬性都進行歸解檔
-(
void)encodeWithCoder:(NSCoder *)aCoder{
   [aCoder
encodeObject:self.name forKey:@"name"];
    [aCoder
encodeObject:self.gender forKey:@"gender"];
    [aCoder
encodeInteger:self.age forKey:@"age"];
}

//解檔
-(
instancetype)initWithCoder:(NSCoder *)aDecoder{
   
if (self = [super init]) {
       
self.name = [aDecoder decodeObjectForKey:@"name"];
       
self.gender = [aDecoder decodeObjectForKey:@"gender"];
       
self.age = [aDecoder decodeIntegerForKey:@"age"];
    }
   
return self;
}
@end


#import "ViewController.h"
#import
"Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (
void)viewDidLoad {
    [
super viewDidLoad];
    // 如果一個對象向直接寫入本地,那麼這個對象需要遵守NSCoding協議

    Person *person = [[Person alloc]init];
    person.
name = @"";
    person.
gender = @"";
    person.
age = 38 ;
   
#pragma mark ------歸檔
    //將複雜對象歸檔之後存入本地
    // 1 : 創建一個NSMutableData ,用於保存歸檔後的對象(初始化歸檔工具)
    NSMutableData *data = [NSMutableData data];
    // 2 : 創建個歸檔工具
   
NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    // 3 : 歸檔
    [keyedArchiver encodeObject:person forKey:@"person"];
    //第 4 步: 結束歸檔
    [keyedArchiver finishEncoding];//這時候才Data存儲好數據
    NSLog(@"data = %@",data);
    //獲取,拼接寫入沙盒路徑
 NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    NSString *dataPath = [documentPathStr stringByAppendingPathComponent:@"person.plist"] ;
    //x寫入
    [data writeToFile:dataPath atomically:YES];
   
   
   
#pragma mark --------解檔並使用
    // 1 : 從本地獲取到Data
   
NSData  *newData = [NSData dataWithContentsOfFile:dataPath];
   
NSLog(@"%@",newData);
   
// 2 : 通過獲取到的data 創建一個解檔工具
   
NSKeyedUnarchiver *keyedUnarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:newData];
   
// 3 :創建一個Person對象,接收解檔結果
   
Person *newPerson = [keyedUnarchiver decodeObjectForKey:@"person"];
   
// 4 :結束解檔
    [keyedUnarchiver
finishDecoding];
   
//
   
NSLog(@"%@",newPerson);
   
   
//歸解檔是一種編碼方式,不是數據本地化的方式
   
//負載對象寫入本地實際上使用的還是writeToFile 的簡單寫入本地的方法
   
//整存整取 writeToFile
    //在一個路徑下存數據,最後一次存進去的東西會覆蓋之前的



總結



  • 簡單對象寫入文件過程: 
  1. 創建字符串獲取存儲文件的文件夾路徑
  2. 創建需要存儲的數據
  3. 創建字符串通過拼接創建並獲得存儲文件的路徑
  4. 寫入 writeToFile

  • 讀取: 通過路徑讀取數據,使用stringWithContentsOfFile方法

  • 歸檔:
  1. 創建對象 (並設置屬性)
  2. 遵循NSCoding協議,並實現方法
  3. 創建實例對象
  4. 創建NSData用來存儲對象並初始化歸檔工具
  5. 創建歸檔工具
  6. 歸檔
  7. 結束歸檔
  8. 獲取,拼接沙盒文件路徑
  9. 寫入

  • 解檔
  1. 獲取沙盒文件路徑
  2. 創建NSData,並接收本地數據
  3. 創建解檔工具,通過NSData
  4. 創建對象,並接收解檔結果
  5. 結束解檔


  • 什麼類型的對象可以直接存入本地?  
  1. NSString(在寫入本地和讀取時,都需要進行UTF8轉碼)
  2. NSArray
  3. NSDictionary
  4. NSData {
  • NSData如何轉出UIImage :   imageWithData:NSData
  • UIImage如果轉成NSData :   UIImageJPEGRepresentation(UIImage *, CGFloat);
}
  • 存入本地的過程? 
1.找到存儲的路徑
2.創建要存儲的數據
3.創建存儲數據的內容
4.存儲數據


     數據本地化的方式 :
  1.      直接寫入本地
  2.      sqlite
  3.      CoreData
  4. NSUserDefaultes(屬性列表,並不是數據本地化的一個方式,但是可以達成數據本地化)
         歸解檔


  • 傳值的方式: 
  1. block
  2. 代理
  3. 屬性
  4. 單例
  5. 通知中心
  6. 數據本地化

  • 設計模式(實現方式)
  1. 單例
  2. 代理
  3. Target-Action
  4. 通知中心

MVC:框架的設計方式

任務
//通訊錄 添加和刪除 聯繫人時 下次打開有變化 



documents(n.文檔)
Directory( n. [計] 目錄;)
Domain(n. 領域;域名;)
Component(n. 成分;組件;)
Representation(n. 代表;表現)
encode(vt. (將文字材料)譯成密碼;編碼,)
decode(vt. [計][通信] 譯碼,解碼)
ćīŚǂvş
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章