藍懿ios技術交流和心得分享16.1.26

// 1.創建AFN管理者 // AFHTTPRequestOperationManager內部包裝了NSURLConnection AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.利用AFN管理者發送請求NSDictionary *params = @{ @"username" : @"520it", @"pwd" : @"520it" }; [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { // 注意點: 如果服務器返回的是JSON, AFN會自動轉換爲OC對象 NSLog(@"請求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) {NSLog(@"請求失敗---%@", error); }];

POST

    // 1.創建AFN管理者
    // AFHTTPRequestOperationManager內部包裝了NSURLConnection
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    // 2.利用AFN管理者發送請求
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it"
                             };
    [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"請求成功---%@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"請求失敗---%@", error);
    }];
    ```##NSURLSession包裝方法###GET```objc
    // 1.創建AFN管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 2.利用AFN管理者發送請求
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it"
                             };

    [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
         NSLog(@"請求成功---%@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"請求失敗---%@", error);
    }];

POST

    // 1.創建AFN管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 2.利用AFN管理者發送請求
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it"
                             };

    [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"請求成功---%@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"請求失敗---%@", error);
    }];

文件下載

    // 1.創建AFN管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 2.利用AFN管理者發送請求
     NSURLRequest *reuqest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];

    [[manager downloadTaskWithRequest:reuqest progress:nil  destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        // targetPath: 已經下載好的文件路徑
        NSLog(@"targetPath = %@", targetPath);
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
        NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[path stringByAppendingPathComponent:response.suggestedFilename]];
        // 返回需要保存文件的目標路徑
        return documentsDirectoryPath;
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSLog(@"filePath = %@", filePath);
    }] resume];

監聽進度

要跟蹤進度,需要使用 NSProgress,是在 iOS 7.0 推出的,專門用來跟蹤進度的類!// 下載時監聽進度- (void)download2{
    // 1. 創建AFNetworking管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 2. 利用AFNetworking管理者發送請求
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];

    // 3.創建NSProgress
    NSProgress *progress = nil;
    self.progress = progress;

    // 4. 創建下載任務
    NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        // 文件移動到caches目錄
        NSString *path = [response.suggestedFilename cacheDir];
        // 獲取文件的URL地址
        NSURL *destURL = [NSURL fileURLWithPath:path];
        // 返回URL地址
        return destURL;
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSLog(@"filePath = %@", filePath);
    }];

    // 5. 給NSProgress註冊監聽, 監聽它的completedUnitCount屬性的改變
    /*     NSProsess屬性:        @property int64_t totalUnitCount; 總大小        @property int64_t completedUnitCount; 完成大小     */
    [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

    [task resume];}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([object isKindOfClass:[NSProgress class]]) {
        NSProgress *progress = (NSProgress *)object;

        // 計算下載進度
        NSLog(@"%f", 1.0 * progress.completedUnitCount / progress.totalUnitCount);
    }}- (void)dealloc{
    [self removeObserver:self.progress forKeyPath:@"completedUnitCount"];}

文件上傳

// 1.創建AFN管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 2.利用AFN管理者發送請求
    [manager POST:@"http://120.25.226.186:32812/upload" parameters:@{@"username" : @"lnj"} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        NSData *data = [NSData dataWithContentsOfFile:@"/Users/NJ-Lee/Desktop/Snip20150811_1.png"];
    // name : 服務器對應的數據參數    
    [formData appendPartWithFileData:data name:@"file" fileName:@"lnj.png" mimeType:@"image/png"];
    } success:^(NSURLSessionDataTask *task, id responseObject) {
          NSLog(@"請求成功---%@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"請求失敗---%@", error);
    }];
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/NJ-Lee/Desktop/Snip20150811_1.png"] name:@"file" fileName:@"lnj.png" mimeType:@"image/png" error:nil];

最好用

[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/NJ-Lee/Desktop/Snip20150811_1.png"] name:@"file" error:nil];
  • AFN解耦

    • 自定義單利類繼承Manager
  • 優點: 替換框架只需要求改單利類即可
  • 序列化

  • AFN默認將服務器返回的數據當做JSON處理, 會自動解析
    • manager.responseSerializer = [AFJSONRequestSerializer serializer];
  • 告訴AFN,以XML形式解析服務器返回的數據
    • manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
  • 告訴AFN, 不處理服務器返回的數據, 原樣返回
    • manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  • 主要用於存儲對象狀態爲另一種通用格式,比如存儲爲二進制、xml、json等等,把對象轉換成這種格式就叫序列化,而反序列化通常是從這種格式轉換回來。

  • 使用序列化主要是因爲跨平臺和對象存儲的需求,因爲網絡上只允許字符串或者二進制格式,而文件需要使用二進制流格式,如果想把一個內存中的對象存儲下來就必須使用序列化轉換爲xml(字符串)、json(字符串)或二進制(流) 

網絡狀態檢測

  • AFN
    // 1.創建網絡監聽對象

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; // 2.設置網絡狀態改變回調 [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { /*AFNetworkReachabilityStatusUnknown = -1, // 未知AFNetworkReachabilityStatusNotReachable = 0, // 無連接AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花錢AFNetworkReachabilityStatusReachableViaWiFi = 2, // 局域網絡,不花錢 */ switch (status) { case 0: NSLog(@"無連接"); break; case 1: NSLog(@"3G 花錢"); break; case 2: NSLog(@"局域網絡,不花錢"); break; default: NSLog(@"未知"); break; } }]; // 3.開始監聽 [manager startMonitoring];

蘋果自帶

    -

(void)viewDidLoad { [super viewDidLoad]; // 註冊通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNetworkStatus) name:kReachabilityChangedNotification object:nil]; // 開始監聽網絡self.reachability = [Reachability reachabilityForInternetConnection];[self.reachability startNotifier];}- (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; [self.reachability stopNotifier];}- (void)getNetworkStatus{ if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus != NotReachable) {NSLog(@"wifi"); }else if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus != NotReachable) {         NSLog(@"手機自帶網絡"); }else { NSLog(@"沒有網絡"); }}

圖片下載
  • 重複下載問題
    • 定義字典保存下載好的圖片

  • 磁盤緩存問題
    • 內存沒有嘗試從磁盤獲取
  • 阻塞主線程問題
    • 新建NSOperationQueue下載圖片
  • 重複設置問題
    • reloadRowsAtIndexPaths
邏輯

1

- 從來沒下載過 1.查看內存緩存是否有圖片 2.查看磁盤緩存是否有圖片 3.查看時候有任務正在下載當前圖片 4.開啓任務下載圖片 5.寫入磁盤 6.緩存到內存 7.移除下載操作 8.顯示圖片 邏輯2 - 已經下載過 1.查看內存緩存是否有圖片 2.查看磁盤緩存是否有圖片 3.使用磁盤緩存 4.將圖片緩存到內存中 5.更新UI 邏輯3 - 已經下載過, 並且不是重新啓動 1.查看內存緩存是否有圖片 2.更新UI

目錄結構:

  • Documents

  • 需要保存由"應用程序本身"產生的文件或者數據,例如:遊戲進度、塗鴉軟件的繪圖
  • 目錄中的文件會被自動保存在 iCloud
  • 注意:不要保存從網絡上下載的文件,否則會無法上架!
  • Caches

  • 保存臨時文件,"後續需要使用",例如:緩存圖片,離線數據(地圖數據)
  • 系統不會清理 cache 目錄中的文件
  • 就要求程序開發時,"必須提供 cache 目錄的清理解決方案"
  • Preferences

  • 用戶偏好,使用 NSUserDefault 直接讀寫!
  • 如果要想數據及時寫入磁盤,還需要調用一個同步方法
  • tmp

  • 保存臨時文件,"後續不需要使用"
  • tmp 目錄中的文件,系統會自動清理
  • 重新啓動手機,tmp 目錄會被清空
  • 系統磁盤空間不足時,系統也會自動清理
  • 封裝獲取文件路徑方法

// cache

-

(NSString *)cacheDir{ // 1.獲取cache目錄 NSString *dir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; return [dir stringByAppendingPathComponent:[self lastPathComponent]];}// document- (NSString *)documentDir { NSString *dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; return [dir stringByAppendingPathComponent:[self lastPathComponent]];}// tmp- (NSString *)tmpDir { NSString *dir = NSTemporaryDirectory(); return [dir stringByAppendingPathComponent:[self lastPathComponent]];}

SDWebImage架構

  • SDWebImageManager

  • SDImageCache
  • SDWebImageDownloader
    • SDWebImageDownloaderOperation
  • SDWebImage常見面試題

  • 默認緩存時間多少

  • 一週
  • 緩存的地址

  • NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns];
  • cleanDisk如何清理過期圖片

  • 刪除早於過期日期的文件
  • 保存文件屬性以計算磁盤緩存佔用空間
  • 如果剩餘磁盤緩存空間超出最大限額,再次執行清理操作,刪除最早的文件
  • clearDisk如何清理磁盤

  • 刪除緩存目錄
  • 新建緩存目錄
  • SDWebImage如何播放圖片

  • 取出gif中每一幀, 生成一張可動畫圖片
  • SDWebImage如何判斷圖片類型

  • 判斷圖片二進制前8個字節
  • kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};

SDWebImage常用方法:

//圖片緩存的基本代碼,就是這麼簡單

[

self

.

image1

sd_setImageWithURL:imagePath1];//用block 可以在圖片加載完成之後做些事情[self.image2 sd_setImageWithURL:imagePath2 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {  NSLog(@"這裏可以在圖片加載完成之後做些事情");}];//給一張默認圖片,先使用默認圖片,當圖片加載完成後再替換[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"]];//使用默認圖片,而且用block 在完成後做一些事情[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {  NSLog(@"圖片加載完成後做的事情");}];//options 選擇方式[self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageRetryFailed];// 直接下載一張圖片 /* 第1個參數: 需要下載圖片的URL 第2個參數: 下載的配置信息(例如是否需要緩存等等) 第3個參數: 下載過程中的回調 第4個參數: 下載完成後的回調 */ NSURL *url = [NSURL URLWithString:@"http://ia.topit.me/a/f9/0a/1101078939e960af9ao.jpg"];[[SDWebImageManager sharedManager] downloadImageWithURL:url options:kNilOptions progress:^(NSInteger receivedSize, NSInteger expectedSize) {// receivedSize : 已經接受到的數據大小 // expectedSize : 需要下載的圖片的總大小NSLog(@"正在下載 %zd %zd", receivedSize, expectedSize); } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { // image : 下載好的圖片 // error: 錯誤信息 // cacheType: 緩存的類型 // finished: 是否下載完成 // imageURL: 被下載的圖片的地址 NSLog(@"下載成功 %@", image); }];

學習ios  重要還是要理清楚思路  在做或者看老師代碼的時候 自己多想想爲什麼  不要自己看着就抄       另外還是要推薦一下 藍懿IOS這個培訓機構  和劉國斌老師劉國斌老師還是很有名氣的,聽朋友說劉老師成立了藍懿iOS,,老師講課方式很獨特,能夠儘量讓每個人都能弄明白,有的比較難懂的地方,如果有的地方還是不懂得話,老師會換個其它方法再講解,這對於我們這些學習iOS的同學是非常好的,多種方式的講解會理解得更全面,這個必須得給個贊,嘻嘻,還有就是這裏的學習環境很好,很安靜,可以很安心的學習,安靜的環境是學習的基礎,小班講課,每個班20幾個學生,學習氛圍非常好,每天都學到9點多才離開教室,練習的時間很充裕,而且如果在練習的過程中有什麼困難,隨時可以向老師求助,不像其它機構,通過視頻教學,有的甚至學完之後都看不到講師本人,問點問題都不方便,這就是藍懿與其它機構的區別,相信在劉國斌老師的細心指導下,每個藍懿學員都能找到滿意的工作,加油!

  •                                                                   寫博客第一百零八天;

                                                                              QQ:565803433


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章