❶ iOS多線程和非同步的聯系與區別
多線程和非同步操作的異同多線程和非同步操作兩者都可以達到避免調用線程阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為多線程和非同步操作是等同的概念。但是,多線程和非同步操作還是有一些區別的。而這些區別造成了使用多線程和非同步操作的時機的區別。非同步操作的本質所有的程序最終都會由計算機硬體來執行,所以為了更好的理解非同步操作的本質,我們有必要了解一下它的硬體基礎。熟悉電腦硬體的朋友肯定對DMA這個詞不陌生,硬碟、光碟機的技術規格中都有明確DMA的模式指標,其實網卡、音效卡、顯卡也是有DMA功能的。DMA就是直接內存訪問的意思,也就是說,擁有DMA功能的硬體在和內存進行數據交換的時候可以不消耗CPU資源。只要CPU在發起數據傳輸時發送一個指令,硬體就開始自己和內存交換數據,在傳輸完成之後硬體會觸發一個中斷來通知操作完成。這些無須消耗CPU時間的I/O操作正是非同步操作的硬體基礎。所以即使在DOS這樣的單進程(而且無線程概念)系統中也同樣可以發起非同步的DMA操作。線程的本質線程不是一個計算機硬體的功能,而是操作系統提供的一種邏輯功能,線程本質上是進程中一段並發運行的代碼,所以線程需要操作系統投入CPU資源來運行和調度。非同步操作的優缺點因為非同步操作無須額外的線程負擔,並且使用回調的方式進行處理,在設計良好的情況下,處理函數可以不必使用共享變數(即使無法完全不用,最起碼可以減少共享變數的數量),減少了死鎖的可能。當然非同步操作也並非完美無暇。編寫非同步操作的復雜程度較高,程序主要使用回調方式進行處理,與普通人的思維方式有些初入,而且難以調試。多線程的優缺點多線程的優點很明顯,線程中的處理程序依然是順序執行,符合普通人的思維習慣,所以編程簡單。但是多線程的缺點也同樣明顯,線程的使用(濫用)會給系統帶來上下文切換的額外負擔。並且線程間的共享變數可能造成死鎖的出現。適用范圍在了解了線程與非同步操作各自的優缺點之後,我們可以來探討一下線程和非同步的合理用途。我認為:當需要執行I/O操作時,使用非同步操作比使用線程+同步I/O操作更合適。I/O操作不僅包括了直接的文件、網路的讀寫,還包括資料庫操作、Web Service、HttpRequest以及.Net Remoting等跨進程的調用。而線程的適用范圍則是那種需要長時間CPU運算的場合,例如耗時較長的圖形處理和演算法執行。但是往往由於使用線程編程的簡單和符合習慣,所以很多朋友往往會使用線程來執行耗時較長的I/O操作。這樣在只有少數幾個並發操作的時候還無傷大雅,如果需要處理大量的並發操作時就不合適了。
❷ iOS多線程訪問資料庫的時候,資料庫被鎖住怎麼辦
這個要看情況。
不同的資料庫情況不一樣。
一般說來是可以每個線程使用一個連接的(有時候會出現很難查找的奇怪問題)
保險一點還是共用一個連接 互斥佔用。
❸ iOS多線程實現的幾種方案
1 Thread 2 Cocoa operations 3 Grand Central Dispatch (GCD) Thread 輕量級 最復雜 你需要自己管理thread的生命周期,線程之間的同步。線程共享同一應用程序的部分內存空間,它們擁有對數據相同的訪問許可權。你得協調多個線程對同一數據的訪問
❹ 在IOS中為什麼使用多線程及多線程實現的三種
在iOS中使用多線程是為了讓我們的頁面不卡,提高用戶體驗。多線程實現的幾種方法如下。
NSThread。這是最輕量級的多線程的方法,使用起來最直觀的多線程編程方法。但是因為需要自己管理線程的生命周期,線程同步。經常使用NSThread進行調試,在實際項目中不推薦使用。
GCD(Grand Central Dispatch),GCD是基於C語言底層API實現的一套多線程並發機制,非常的靈活方便,在實際的開發中使用很廣泛。簡單來說CGD就是把 操作 放在 隊列 中去執行。
NSOperation & NSOperationQueue,雖然GCD的功能已經很強大了,但是它使用的API依然是C語言的。在某些時候,在面向對象的objective-c中使用起來非常的不方便和不安全。所以蘋果公司把GCD中的操作抽象成NSOperation對象,把隊列抽象成NSOperationQueue對象。
❺ ios 幾種多線程 區別
1 Thread
2 Cocoa operations
3 Grand Central Dispatch (GCD)
Thread 輕量級 最復雜 你需要自己管理thread的生命周期,線程之間的同步。線程共享同一應用程序的部分內存空間,它們擁有對數據相同的訪問許可權。你得協調多個線程對同一數據的訪問,一般做法是在訪問之前加鎖,這會導致一定的性能開銷。在 iOS 中我們可以使用多種形式的 thread:
Cocoa threads: 使用NSThread 或直接從 NSObject 的類方法 performSelectorInBackground:withObject: 來創建一個線程。如果你選擇thread來實現多線程,那麼 NSThread 就是官方推薦優先選用的方式。
POSIX threads: 基於 C 語言的一個多線程庫,
Cocoa operations是基於 Obective-C實現的,類 NSOperation 以面向對象的方式封裝了用戶需要執行的操作,我們只要聚焦於我們需要做的事情,而不必太操心線程的管理,同步等事情,因為NSOperation已經為我們封裝了這些事情。 NSOperation 是一個抽象基類,我們必須使用它的子類。iOS 提供了兩種默認實現:NSInvocationOperation 和 NSBlockOperation。
Grand Central Dispatch (GCD): iOS4 才開始支持,它提供了一些新的特性,以及運行庫來支持多核並行編程,它的關注點更高:如何在多個 cpu 上提升效率。
❻ ios開發 什麼情況要用到資料庫
第一,我不是高手,第二,我可以分享下我的心得。一般的數據量很小的項目,沒必要使用資料庫,如果只是保存寫用戶信息,大可以用其他的方法,用keychain或者nsuserdefault或者其他的都可以。任何一個項目都需要保存一個使用狀態,不能每次打開項目的時候都和第一次運行一樣,完全新,要給人以使用過的感覺就要存儲一些歷史數據。如果怕影響用戶體驗的話,可以多開線程在後台去對數據操作(數據量大的情況下),記得對線程要回收。如果你對保存數據比較迷茫的話,你可以google一下ios的四種數據持久化,對於sqlite和coredata,我個人認為只是兩種不同的存儲方法,一種是小型輕量級sqlite資料庫,所有移動設備經常用到的,還有一種是蘋果針對ios操作系統開發的coredata數據存儲,具體孰勝孰略還有待你自己去了解,一般如果我的資料庫要非常多的表格互相關聯最後查詢一條結果那麼我會採用sqlite,如果存儲一些有規律的數據那麼我會採用coredata,沒有哪個更好的說法,只能說這兩種都各有千秋,而我聽前輩們說,coredata只是蘋果對sqlite的又一次封裝而已,方便操作但也局限操作
❼ ios coredata操作資料庫的時候會自動開始多線程嗎
我仔細讀了一下apple的文檔,是因為我在主線程中創建的兩個NSManagedObjectContext, 正確的做法是:哪個線程用到的moc就在那個線程內創建。 所以你把threadManageContext放在線程中創建,就正確了。
❽ 在iOS開發為什麼使用多線程 多線程有哪些
1、概念性知識:iOS開發中有主線程(也可叫UI)線程和子線程(你自己通過方法開辟的線程)的概念,子線程和主線程的合稱可以稱為多線程。
2、為什麼用多線程開發:正常一個簡單的軟體,如果沒有比較消耗性能設時間的操作是無需開辟子線程的,我們去一條線程(主線程)上去添加UI、載入數據、刷新,很快,因為載入的數據其實是很小的。但是如果有了諸如圖片下載,視頻下載等需要花費比較多時間的操作就必須開辟子線程了,圖片、視頻比較大,下載浪費時間,如果主線程下載,那麼整個APP的界面就不動了,因為線程正在忙著下載呢,沒時間去刷新UI、響應用戶任務(如點擊手勢等)和載入數據給用戶看,APP在辛苦的下載工作,但是用戶一看,這軟體不動了,以為卡死了,就關了或者卸載了,這樣的體驗不是我們想要的,所以開辟子線程相當於喊來一個朋友,讓他去下載,你可以繼續做刷新UI、響應用戶任務(如點擊手勢等)和載入數據給用戶看等事情,互不影響,效率提高了,代價是多消耗了寫CPU。
3、常規使用多線程有哪些:NSThread , NSOperation(NSOperationQueue) , GCD主要3種,後兩種使用較多。蘋果推薦使用NSOperation,因為它是面向對象的,和oc一樣,換可以控制線程的開始,暫停,取消。GCD這樣是C語言函數,函數略生澀,使用很方便,可以實現延時,單次,調度組執行,具體實現網上有很多帖子。
❾ 在IOS中為什麼使用多線程及多線程實現的三種方法
多線程是一個比較輕量級的方法來實現單個應用程序內多個代碼執行路徑。
在系統級別內,程序並排執行,程序分配到每個程序的執行時間是基於該程序的所需時間和其他程序的所需時間來決定的。
然而,在每個程序內部,存在一個或者多個執行線程,它同時或在一個幾乎同時發生的方式里執行不同的任務。
概要提示:
iPhone中的線程應用並不是無節制的,官方給出的資料顯示,iPhone OS下的主線程的堆棧大小是1M,第二個線程開始就是512KB,並且該值不能通過編譯器開關或線程API函數來更改,只有主線程有直接修改UI的能力
一、線程概述
有些程序是一條直線,起點到終點——如簡單的hello world,運行列印完,它的生命周期便結束了,像是曇花一現。
有些程序是一個圓,不斷循環直到將它切斷——如操作系統,一直運行直到你關機。
一個運行著的程序就是一個進程或者叫做一個任務,一個進程至少包含一個線程,線程就是程序的執行流。
Mac和IOS中的程序啟動,創建好一個進程的同時,一個線程便開始運作,這個線程叫做主線程。主線成在程序中的位置和其他線程不同,它是其他線程最終的父線程,且所有的界面的顯示操作即AppKit或UIKit的操作必須在主線程進行。
系統中每一個進程都有自己獨立的虛擬內存空間,而同一個進程中的多個線程則公用進程的內存空間。
每創建一個新的進成,都需要一些內存(如每個線程有自己的stack空間)和消耗一定的CPU時間。
當多個進成對同一個資源出現爭奪的時候需要注意線程安全問題
創建線程
創建一個新的線程就是給進程增加一個執行流,所以新建一個線程需要提供一個函數或者方法作為線程的進口。
1.使用NSThread
NSThread提供了創建線程的路徑,還可以提供了監測當前線程是否是主線程的方法使用NSThread創建一個新的線程有兩種方式:
1.創建一個NSThread的對象,調用Start方法——使用一個目標對象的方法初始化一個NSThread對象,或者創建一個繼承自NSThread的子類,實現起main方法?,然後在直接創建這個子類的對象。
2.使用detachNewThreadSelector:toTarget:withObject:這個類方法創建一個子線程,這個比較直接,直接使用目標對象的方法作為線程啟動入口
2.使用NSObject
使用NSObject直接就加入了對多線程的支持,允許對象的某個方法在後台運行。
[my0bj performSelectorInBackground:@selector(doSomething) withObject:nil];
3.POSIX Thread
由於Mac和IOS都是基於Darwin系統,Darwin系統的UNX內核,是基於mach和BSD的,繼承了BSD的POSIX介面,所以可以直接使用POSIX線程的相關介面開實現線程
創建線程的介面為 pthread_create, 當然在創建線程之前可以創建好相關線程的屬性