1. 程式人生 > >6 SDWebImageDownloaderOperation類

6 SDWebImageDownloaderOperation類

finish key 進度 tno ron select ima 能夠 lock

繼承於NSOperation類 重寫了-start方法。手動管理操作的狀態,只有發送isFinished的KVO消息時,才認為是operation結束。 為了讓操作隊列能夠捕捉到操作的改變,需要將狀態的屬性以配合KVO的方式進行實現。
  • isExecuting 代表任務正在執行中
  • isFinished 代表任務已經執行完成
  • isCancelled 代表任務已經取消執行
- (void)setFinished:(BOOL)finished { [self willChangeValueForKey:@"isFinished"]; _finished = finished; [self didChangeValueForKey:@"isFinished"]; } -start 1.線程同步鎖(以self作為互斥信號量)判斷cancel,如果為YES,認為該任務完成,並及時收回資源(-reset) 2.判斷是否進入後臺,如果進入了後臺,將當前任務放到後臺執行。 sself.backgroundTaskId = UIBackgroundTaskInvalid; 意思就是告訴系統,任務完成,不需要考慮進不進入後臺運行的問題了。確實,在start函數末尾,就是判斷如果下載任務完成(不管有沒有下載成功),就將backgroundTaskId置為UIBackgroundTaskInvalid。 3、初始化NSURLConnection [self.connection start]; 4.connection 創建成功,返回進度(0,size)。 5.發送開始的通知:SDWebImageDownloadStartNotification 6.runloop 開啟 7.判斷 isFinished 屬性,如果為no,取消網絡,返回報錯信息。回收資源。 -cancel - (void)cancel { @synchronized (self) { if (self.thread) { [self performSelector:@selector(cancelInternalAndStop) onThread:self.thread withObject:nil waitUntilDone:NO]; } else { [self cancelInternal]; } } } 每個NSTread都會有一個CFRunLoop ,所以要取消的話,要stop這個RunLoop。所以self.thread存在的話,要stop runloop - (void)cancelInternal
  1. 調用自定義的cancelBlock。
  2. 調用NSURLConnection的cancel取消self.connection。
  3. 回收資源。
取消操作 isCancelled並沒有實時操作,在start時檢測一次,重寫了cancel 方法 , 回調cancelBlock,網絡請求取消,狀態設置,並發了一個通知 SDWebImageDownloadStopNotification。將線程停止,屬性置為空。 完成狀態:-done 設置finished,executing狀態,屬性置為空。 網絡請求 didReceiveData方法: imageData 數組 添加 接收到的data 計算方向,圖片高度快讀朝向,orientation屬性用來記錄方向。 然後解決失真問題 網絡請求成功:將請求的數據arr(image)轉化為UIImage,將url緩存到[SDWebImageManager sharedManager]中, SDScaledImageForKey方法: 對圖片進行縮放(根據屏幕),然後進行解壓 -decodedImageWithImage

6 SDWebImageDownloaderOperation類