[tableView reloadData] 和 runloop

来源:http://www.cnblogs.com/xs514521/archive/2016/09/16/5876488.html
-Advertisement-
Play Games

需要[tableView reloadData]後需要立即獲取tableview的cell、高度,或者需要滾動tableview,那麼,直接在reloadData後執行代碼是會有問題的。 斷點調試感覺[tableview reloaddata]是個非同步操作導致下麵的代碼並不會再它執行完後才執行。 於 ...


需要[tableView reloadData]後需要立即獲取tableview的cell、高度,或者需要滾動tableview,那麼,直接在reloadData後執行代碼是會有問題的。

斷點調試感覺[tableview reloaddata]是個非同步操作導致下麵的代碼並不會再它執行完後才執行。

於是就想到了多線程,最簡單使用動畫來延遲執行

[UIView animateWithDuration:0.3 animations:^{
            [self.collectionView reloadData];
        } completion:^(BOOL finished) {
            [self.collectionView setContentOffset:offset animated:NO];
        }];

解決是解決了,但是感覺有特別明顯的動畫效果還是去查了資料才知道是runloop的原因而不是非同步問題

大神解說是因為[tableview reloaddata] 需要在當前方法在runloop中執行完後它再在runloop中執行,處理函數是在runloop中串列的排隊執行的。但是[tableview reloaddata]後面的代碼需要[tableview reloaddata]的計算結果,所以[tableview reloaddata]後面的代碼需要一個延遲執行。只有當前方法不再占用runloop,[tableview reloaddata]才可以在runloop中執行,而這時延遲執行的部分在runloop中早就排在了[tableview reloaddata]的前面執行完了。如果表中的數據非常大,在一個runloop周期沒執行完,這時,需要tableview視圖數據的操作就會出問題了。apple並沒有直接提供reloadData的api,想要程式延遲到reloadData結束再操作,可以用以下方法

方法1:layoutIfNeeded會強制重繪並等待完成

[self.tableView reloadData];  
[self.tableView layoutIfNeeded];  
//刷新完成  

方法2:

reloadData會在主隊列執行,而dispatch_get_main_queue會等待機會,直到主隊列空閑才執行。

[self.collectionView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
    // 刷新完成
    [self.collectionView setContentOffset:offset animated:NO];
    });
}

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在上一篇《webpack從入門到上線》介紹了wepack的配置和相關的概念,這一篇介紹怎樣寫一個webpack loader. 通過寫一個js的html模板為例子。 上篇文章已提及,loader載入器就是對各種非正常資源的解析,轉化成瀏覽器可以識別的js/css文件等,甚至可以說loader就是一個 ...
  • jQuery有效果函數方法 描述 animate() 對被選元素應用“自定義”的動畫 clearQueue() 對被選元素移除所有排隊的函數(仍未運行的) delay() 對被選元素的所有排隊函數(仍未運行)設置延遲 dequeue() 運行被選元素的下一個排隊函數 fadeIn() 淡入被選元素至 ...
  • jQuery 擁有可操作 HTML 元素和屬性的強大方法。 jQuery 遍歷函數 jQuery 遍歷函數包括了用於篩選、查找和串聯元素的方法。 jQuery DOM 操作 jQuery 中非常重要的部分,就是操作 DOM 的能力。 jQuery 提供一系列與 DOM 相關的方法,這使訪問和操作元素 ...
  • 使用JQuery,可以很容易的選擇THML元素。但在有些時候,HTML結構比較複雜的時候,提煉我們選擇的元素就是一件比較麻煩的事情。 1、children 這個函數得到一組元素的直接子級。 給children()傳遞一個選擇表達式將選擇結果縮小至選中的元素; 如果chilidren()每接受任何參數 ...
  • JQuery可以創建顯示、隱藏、切換、滑動以及自定義動畫等效果。 1.hide()/show() hide()/show()是最基礎也是用的最多的一種效果,它用來控制元素的隱藏與顯示。 下麵是還沒有進行hide()/show()操作的示例: <style> .demo { margin:100px ...
  • 1、數組API——splice: ①刪除:var deletes=arr.splice(starti,n);刪除starti位置開始的n個,返回刪除元素組成的臨時數組; ②插入:arr.splice(starti,0,值1,值2……);在starti位置插入值1,值2……; ③替換:var dele ...
  • ...
  • 1.從SetContentView講起 1.1Activty的setContentView裡面的內容 首先這個getWindow是什麼? mWindow, 作用: 在attach@ativity 方法裡面定義的。預設就是PhoneWindow.也就是Activity裡面包含的window實例。 @O ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...