ios線程資料庫
『壹』 ios 線程與進程
1.進程
具有一定獨立功能的程序關於某次數據集合的一次運行活動,他是操作系統分配資源的基本單位。
進程是指系統正在運行的一個應用程序,就是一段程序的執行過程。
各進程之間相互獨立,每個進程都運行在受保護的內存空間內,擁有獨立運行所需的全部資源。
2. 線程
進程的最小執行單元。線程是一個進程的實體。
一個進程要想執行任務,就必須至少又一個線程,當程序啟動時,系統默認開啟一條線程,也就是主線程。
3、 進程與線程的關系
線程是進程的執行單元,進程的所有任務都在線程中執行
線程是CPU分配和執行任務的最小單元
一個程序可以有多進程,一個進程可以有多線程 ,但是一個進程至少有一個線程
同一個進程內的線程共享進程內的資源
4 多線程原理
同一時間內單核CPU 只執行一個線程,多線程是CPU 在單位時間內在多個線程之間切換,造成多個線程被同時執行的假象。
多核CPU 就可以執行多個線程
多線程的目的是同步執行多個線程,來提高運行效率
5、多線程的優缺點
有點:提高執行效率 能夠提高CPU的使用率
缺點:佔用一定的系統內存空間 線程越多 CPU 調度線程的開銷越大 程序設計復雜(線程之間的通信 數據共享)
6、多線程並發 與並行區別
並發:在一條線程上快速切換
並行: 利用多核CPU ,多線程同時進行
7、IOS 中的多線程
NSThread 需要手動創建 不需要銷毀 子線程通信很難
GCD c語言,充分利用了設備的多核,自動管理線程生命周期。比NSOperation效率更高。
NSOperation 基於gcd封裝,更加面向對象,比gcd多了一些功能。
8、多個網路請求如何執行下一步
使用GCD的dispatch_group_t
創建一個dispatch_group_t
每次網路請求前先dispatch_group_enter,請求回調後再dispatch_group_leave,enter和leave必須配合使用,有幾次enter就要有幾次leave,否則group會一直存在。
當所有enter的block都leave後,會執行dispatch_group_notify的block。
NSString *str = @"http://www.jianshu.com/p/6930f335adba";
NSURL*url = [NSURLURLWithString:str];
NSURLRequest*request = [NSURLRequestrequestWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];
dispatch_group_tdownloadGroup =dispatch_group_create();
for ( int i=0; i<10; i++) {
dispatch_group_enter(downloadGroup);
NSURLSessionDataTask*task = [sessiondataTaskWithRequest:requestcompletionHandler:^(NSData* _Nullable data,NSURLResponse* _Nullable response,NSError* _Nullable error) {
NSLog(@"%d---%d",i,i);
dispatch_group_leave(downloadGroup);
}];
[taskresume];
}
dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{
NSLog(@"end");
});
7.多個網路請求順序執行後如何執行下一步?
使用信號量semaphore
每一次遍歷,都讓其dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER),這個時候線程會等待,阻塞當前線程,直到dispatch_semaphore_signal(sem)調用之後
NSString*str=@"http://www.jianshu.com/p/6930f335adba";
NSURL*url=[NSURL URLWithString:str];
NSURLRequest*request=[NSURLRequest requestWithURL:url];
NSURLSession*session=[NSURLSession sharedSession];
dispatch_semaphore_t sem=dispatch_semaphore_create(0);
for(inti=0;i<10;i++){
NSURLSessionDataTask*task=[session dataTaskWithRequest:request completionHandler:^(NSData*_Nullable data,NSURLResponse*_Nullable response,NSError*_Nullable error){
NSLog(@"%d---%d",i,i);
dispatch_semaphore_signal(sem);
}];
[task resume];
dispatch_semaphore_wait(sem,DISPATCH_TIME_FOREVER);
}
dispatch_async(dispatch_get_main_queue(),^{
NSLog(@"end");
});
『貳』 iOS開發:主線程和子線程同時操作數據,如何保持同步
建子線程的時候把主線程中的數組作為lParam傳遞給子線程.
『叄』 ios app用什麼資料庫
iOS app一般常用的資料庫有sqlite和coredata。
sqlite使用的是SQL語句,代碼會比較復雜,一般不是特別大得數據可以用sqlite來寫。
蘋果的建議是使用coredata,但是coredata在邏輯上會復雜一些,如果能把握住coredata的邏輯關系,那會大大的提高工作效率。
一般建議使用第三方庫來寫
『肆』 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 coredata操作資料庫的時候會自動開始多線程嗎
我仔細讀了一下apple的文檔,是因為我在主線程中創建的兩個NSManagedObjectContext, 正確的做法是:哪個線程用到的moc就在那個線程內創建。 所以你把threadManageContext放在線程中創建,就正確了。
『陸』 ios中使用資料庫應注意什麼
iPhone中資料庫使用方法是本文要介紹的內容,直接進入話題介紹,iPhone 中使用名為 SQLite 的資料庫管理系統。它是一款輕型的資料庫,是遵守ACID的關聯式資料庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,
在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、PHP、Java 等,還有 ODBC 介面,同樣比起 Mysql、PostgreSQL 這兩款開源世界著名的資料庫管理系統來講,它的處理速度比他們都快。
其使用步驟大致分為以下幾步:
1. 創建DB文件和表格
2. 添加必須的庫文件(FMDB for iPhone, libsqlite3.0.dylib)
3. 通過 FMDB 的方法使用 SQLite
創建DB文件和表格
$ sqlite3 sample.db sqlite> CREATE TABLE TEST( ...> id INTEGER PRIMARY KEY, ...> name VARCHAR(255) ...> );
簡單地使用上面的語句生成資料庫文件後,用一個圖形化SQLite管理工具,比如 Lita 來管理還是很方便的。
然後將文件(sample.db)添加到工程中。
添加必須的庫文件(FMDB for iPhone, libsqlite3.0.dylib)
首先添加 Apple 提供的 sqlite 操作用程序庫 ibsqlite3.0.dylib 到工程中。位置如下
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${VER}.sdk/usr/lib/libsqlite3.0.dylib
這樣一來就可以訪問資料庫了,但是為了更加方便的操作資料庫,這里使用 FMDB for iPhone。
svn co http://flycode.googlecode.com/svn/trunk/fmdb fmdb
如上下載該庫,並將以下文件添加到工程文件中:
FMDatabase.h FMDatabase.m FMDatabaseAdditions.h FMDatabaseAdditions.m FMResultSet.h FMResultSet.m
通過 FMDB 的方法使用 SQLite
使用 SQL 操作資料庫的代碼在程序庫的 fmdb.m 文件中大部分都列出了、只是連接資料庫文件的時候需要注意 — 執行的時候,參照的資料庫路徑位於 Document 目錄下,之前把剛才的 sample.db 文件拷貝過去就好了。
位置如下
/Users/xxxx/Library/Application Support/iPhone Simulator/User/Applications/xxxx/Documents/sample.db
BOOL success; NSError *error; NSFileManager *fm = [NSFileManager defaultManager]; NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *writableDBPath = [documentsDirectory :@"sample.db"]; success = [fm fileExistsAtPath:writableDBPath]; if(!success){ NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] :@"sample.db"]; success = [fm ItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; if(!success){ NSLog([error localizedDescription]); } } // 連接DB FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath]; if ([db open]) { [db setShouldCacheStatements:YES]; // INSERT [db beginTransaction]; int i = 0; while (i++ < 20) { [db executeUpdate:@"INSERT INTO TEST (name) values (?)" , [NSString stringWithFormat:@"number %d", i]]; if ([db hadError]) { NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]); } } [db commit]; // SELECT FMResultSet *rs = [db executeQuery:@"SELECT * FROM TEST"]; while ([rs next]) { NSLog(@"%d %@", [rs intForColumn:@"id"], [rs stringForColumn:@"name"]); } [rs close]; [db close]; }else{ NSLog(@"Could not open db."); }
『柒』 iOS--進程和線程
進程: 一個在內存中運行的應用程序。進程是表示資源分配的的基本概念。
線程: 進程中的一個執行任務(控制單元),負責當前進程中程序的執行。
1、根本區別: 進程是操作系統資源分配的基本單位,而線程是處理器任務調度和執行的基本單位。
2、一個線程只能屬於一個進程,但是一個進程可以擁有多個線程。多線程處理就是允許一個進程中在同一時刻執行多個任務。
3、進程有自己的獨立地址空間,進程之間的地址空間和資源是相互獨立的;而線程是共享進程中的地址空間和資源。也因此線程之間切換比進程之間切換的資源開銷小,同樣創建一個線程的開銷也比進程要小很多。
4、因為同一進程下的線程共享全局變數、靜態變數等數據,所以線程之間的通信更方便。而進程之間通信需要要復雜一些。
5、多進程程序更健壯,因為進程有自己獨立的地址空間,一個進程崩潰後,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。
6、每個獨立的進程有程序運行的入口、順序執行序列和程序出口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制,兩者均可並發執行:
多進程:操作系統中同時運行的多個程序
多線程:在同一個進程中同時運行的多個任務
進程通信(Interprocess Communication,IPC)是一個進程與另一個進程間共享消息的一種通信方式。
進程通信的目的
數據傳輸:一個進程需要將其數據發送給另一進程。
共享數據:多個進程操作共享數據。
事件通知:一個進程需要向另一個或一組進程發送消息,通知它(它們)發生了某種事件。
進程式控制制:有些進程希望完全控制另一個進程的執行(如Debug進程。
進程通信方式
每個進程各自有不同的地址空間,任何一個進程的全局變數在另一個進程中都看不到,所以進程之間要交換數據必須通過內核,在內核中開辟一塊緩沖區,進程A把數據從用戶空間拷到內核緩沖區,進程B再從內核緩沖區把數據讀走,內核提供的這種機制稱為進程間通信。
1.無名管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
2.高級管道(popen):將另一個程序當做一個新的進程在當前程序進程中啟動,則它算是當前程序的子進程,這種方式我們成為高級管道方式。
3.有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
4.消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
5.信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
6.信號 ( sinal ) : 信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
7.共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。
8.套接字( socket ) : 套解字也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同機器間的進程通信。
『捌』 iOS線程同步(各種鎖)
在iOS開發中經常會遇到一塊資源被多個線程共享的情況,也就是多個線程會訪問同一塊資源,比如多個線程訪問同一個對象、同一個變數、同一個文件,當多個線程訪問同一塊資源時,很容易引發數據錯亂和數據安全問題
使用線程同步技術(同步就是協同步調,按預定的先後順序進行),常見的同步技術時加鎖
OSSpinLock叫做」自旋鎖」,等待鎖的線程會處於忙等(busy-wait)狀態,一直佔用著CPU資源,目前已經不再安全,從iOS10已經廢棄了,可能會出現優先順序反轉問題,如果等待鎖的線程優先順序較高,它會一直佔用著CPU資源,優先順序低的線程就無法釋放鎖,使用需要導入頭文件#import <libkern/OSAtomic.h>。
os_unfair_lock用於取代不安全的OSSpinLock ,從iOS10開始才支持,從底層調用看,等待os_unfair_lock鎖的線程會處於休眠狀態,並非忙等,使用需要導入頭文件#import <os/lock.h>。
mutex叫做」互斥鎖」,等待鎖的線程會處於休眠狀態,使用需要導入頭文件#import <pthread.h>
NSLock、NSRecursiveLock是對mutex普通鎖的封裝,NSLock遵守NSLocking協議
初始化鎖 NSLock *lock = [[NSLock alloc] init];
NSRecursiveLock也是對mutex遞歸鎖的封裝,API跟NSLock基本一致
NSCondition是對mutex和cond的封裝,NSCondition遵守NSLocking協議
NSCondition通常用於生產者消費者模式的業務中,當不滿足條件時調用wait方法讓消費者線程等待,當條件滿足時調用signal方法通知消費者線程。
NSConditionLock是對NSCondition的進一步封裝,可以設置具體的條件值
NSConditionLock都可以設置不同線程間的依賴,讓滿足條件值的線程先執行,不滿足條件的線程處於等待狀態。
semaphore叫做」信號量」,信號量的初始值,可以用來控制線程並發訪問的最大數量,信號量的初始值為1,代表同時只允許1條線程訪問資源,保證線程同步
@synchronized是對mutex遞歸鎖的封裝,源碼查看:objc4中的 objc-sync.mm 文件,@synchronized(obj)內部會生成obj對應的遞歸鎖,然後進行加鎖、解鎖操作
性能從高到底排序
dispatch_barrier_async
dispatch_barrier_async又叫柵欄函數,這個函數傳入的並發隊列必須是自己通過dispatch_queue_cretate創建的,如果傳入的是一個串列或是一個全局的並發隊列,那這個函數便等同於dispatch_async函數的效果,使用柵欄函數可以保證同一時間只有一個線程可進行寫操作,讀操作可以有多少個線程進行。
『玖』 iOS開發:主線程和子線程同時操作數據,如何保持同步
可以在主線程調用子線程之前設置一個變數保存當前數組大小,子線程開始時先將數組中指定大小的部分復制到一個臨時的數組,並對這個臨時數組進行操作,子線程結束時通知主線程將數組清空(清空數組的時間很短,應該不會耽誤接受數據吧,如果接收數據實在頻繁以至於在清空數組的過程中可能會有新到數據,那麼可以維護一個數組大小變數起數組指針作用,當本需要清空數組時將改變數賦0,這樣新到的數據就直接覆蓋數組中指針指向的位置的值,而不必清空數組)。