iOS 多線程及其他補充 02,ios多線程補充02

來源:互聯網
上載者:User

iOS 多線程及其他補充 02,ios多線程補充02

  • NSOperation

    • NSOperation是個抽象類別,並不具備封裝操作的能力,必須使用它的子類
  • NSInvocationOperation

    • 如果直接執行NSInvocationOperation中的操作, 那麼預設會在主線程中執行
    •  NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil]; [op1 start];

       

  • NSBlockOperation
    • 如果只封裝了一個操作, 那麼預設會在主線程中執行
    • 果封裝了多個操作, 那麼除了第一個操作以外, 其它的操作會在子線程中執行
    • NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"1- %@", [NSThread currentThread]);    }];[op1 start];

       

  • 自訂Operation
      • @implementation XMGOperation- (void)main{    NSLog(@"%s, %@", __func__,[NSThread currentThread]);}@end

         

  • NSOperationQueue
  • GCD隊列和NSOperationQueue對比

    • GCD
      • 串列: 自己建立, 主隊列
      • 並發: 自己建立, 全域
      NSOperationQueue
      • 自己建立: alloc/init
      • 主隊列 : mainQueue
  • NSOperationQueue特點

    • 任務添加到自己建立隊列中會開啟新線程
      • 預設是並發: maxConcurrentOperationCount -1
      • 串列 : maxConcurrentOperationCount = 1
    • 任務添加到mainQueue隊列中不會開啟新線程
  • Invocation

      • // 1.建立隊列    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    // 2.封裝任務    NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil];    // 3.將任務添加到隊列中    [queue addOperation:op1];

         

  • block
      • // 1.建立隊列    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    // 2.封裝任務     NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{     NSLog(@"1 = %@", [NSThread currentThread]);     }];     // 3.將任務添加到隊列中     [queue addOperation:op1];    // 1.建立隊列    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    // addOperationWithBlock方法會做兩件事情    // 1.根據傳入的block, 建立一個NSBlockOperation對象    // 2.將內部建立好的NSBlockOperation對象, 添加到隊列中    // 2.將任務添加到隊列中    [queue addOperationWithBlock:^{        NSLog(@"1 = %@", [NSThread currentThread]);    }];    [queue addOperationWithBlock:^{        NSLog(@"2 = %@", [NSThread currentThread]);    }];

         

  • 自訂
      • // 1.建立隊列    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    // 2.封裝任務    JXOperation *op1 = [[JXOperation alloc] init];    // 3.將任務添加到隊列中    [queue addOperation:op1];

         

  • 暫停-恢複
      • 不會暫停當前正在執行的任務
      • 會從第一個未執行的任務恢複執行
      • // 如果是YES, 代表需要暫停// 如果是NO ,代表恢複執行self.queue.suspended = YES;

         

  • 取消
      • 不會取消當前正在執行的任務
      • 取消後任務不能恢複
      • 耗時操作應該沒執行一段判斷一次
      • // 內部會調用所有任務的cancel方法[self.queue cancelAllOperations];

         

  • 線程間通訊
      • NSOperationQueue *queue = [[NSOperationQueue alloc] init];// 開啟子線程[queue addOperationWithBlock:^{        // 回到主線程        [[NSOperationQueue mainQueue] addOperationWithBlock:^{        }];}];

         

  • 依賴和監聽
      • 只有被依賴的任務完成, 才會執行當前任務
      • 可以跨隊列依賴
      •  [operationB addDependency:operationA]; // 操作B依賴於操作A    op1.completionBlock = ^{        NSLog(@"第一張圖片下載完畢");    };    op2.completionBlock = ^{        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 目錄會被清空
        • 系統磁碟空間不足時,系統也會自動清理
      • 封裝擷取檔案路徑方法

      • - (NSString *)cacheDir{    // 1.擷取cache目錄    NSString *dir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];    return [dir stringByAppendingPathComponent:[self lastPathComponent]];}- (NSString *)documentDir {    NSString *dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    return [dir stringByAppendingPathComponent:[self lastPathComponent]];}- (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};
    • CocoaPods 是什麼?

      • CocoaPods 是開發 OS X 和 iOS 應用程式的一個第三方庫的依賴管理工具。利用 CocoaPods,可以定義自己的依賴關係 (稱作 pods),並且隨著時間的變化,以 及在整個開發環境中對第三方庫的版本管理非常方便
    • CocoaPods 背後的理念主要體現在兩個方面

      • 在工程中引入第三方代碼 會涉及到許多內容。針對 Objective-C 初級開發人員來說,工程檔案的配置會讓 人很沮喪
      • 在配置buildphases和linker flags過程中,會引起許多人為因素的 錯誤
      • CocoaPods 簡化了這一切,它能夠自動設定編譯選項
    • CocoaPods的原理

      • 它是將所有的依賴庫都放到另一個名為Pods項目中,然後 讓主專案依賴Pods項目,這樣,源碼管理工作都從主專案移到了Pods項目中
      • 1、Pods項目最終會編譯成一個名為libPods.a的檔案,主專案只需要依賴這個.a 檔案即可。
      • 2、對於資源檔,CocoaPods提供了一個名為Pods-resources.sh的bash指令碼, 該指令碼在每次項目編譯的時候都會執行,將第三方庫的各種資源檔複製到目 標目錄中。
      • 3、CocoaPods通過一個名為Pods.xcconfig的檔案來在編譯時間設定所有的依賴和 參數。
    • CocoaPods安裝

      • 更新gem
        • sudo gem update --system
      • 更新ruby的軟體源
        • gem sources --remove https://rubygems.org/
        • gem sources -a http://ruby.taobao.org/
        • gem sources -l
      • 安裝CocoaPods
        • sudo gem install cocoapods
      • 替換CocoaPods的鏡像索引
        • pod repo remove master
        • pod repo add master http://git.oschina.net/akuandev/Specs.git
        • pod repo add master https://gitcafe.com/akuandev/Specs.git
        • pod repo update
      • 設定 pod 倉庫
        • pod setup
      • 測試
        • pod --version
    • 卸載CocoaPods

      • sudo gem uninstall cocoapods
    • CocoaPods使用:

      • 使用時需要建立一個名為Podfile的檔案
      • 將依賴的庫名字依次列在檔案中
    platform :iospod'AFNetworking'
    • 注釋事項
      • 1.利用CocoPods管理類庫後, 以後開啟項目就用xxxx.xcworkspace 開啟,而不是 之前的.xcodeproj檔案
      • 2.每次更改了Podfile檔案,你需要重新執行一次pod update命令。
      • 3.CocoaPods在執行pod install和pod update時,會預設先更新一次CocoPods的 spec倉庫索引。使用--no-repo-update參數可以禁止其做索引更新操作
    pod install --no-repo-updatepod update --no-repo-update

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.