One, multi-threaded 1, what is multi-threaded
Nsthread
(1) Multithreading can handle requests for multiple tasks at the same time. If you want to perform multiple tasks at the same time, you need to open a new thread. The execution of the program is executed serially, if multiple tasks are executed in parallel.
// Create a new thread 1 Object : nil]; [Thread1 start]; // Create a new thread 2 [Nsthread detachnewthreadselector: @selector (taskb:) totarget:self Withobject:nil];
(2) What problems can be solved by multithreading?
//
Essentially, it is mainly to solve the problem of the interface card that occurs when a time-consuming task executes, so that multiple tasks can be executed simultaneously, such as thunder download.
//
Scenes using, such as barley nets, some pictures download time 5 seconds, or load 1G files, need to start multithreading.
//
(3) thread synchronization and lock presentation issues
The CPU takes the data change value out of memory and then puts it back into memory, which may be incorrect if multithreaded access. The solution is locking.
-(void) add{ for(intI=0; i< +; i++) {[_lockLock]; _num++; NSLog (@"Add ==%d", _num); [_lock unlock]; }}-(void) sub{ for(intI=0; i< +; i++) {[_lockLock]; _num--; NSLog (@"Sub ==%d", _num); [_lock unlock]; }}
Project development, noatomic when a property only UI interface Access can be added, improve access speed. If this property is created by a child thread, do not add noatomic to secure the thread.
The UI thread is called the main thread, and the other threads that are created are called working sub-threads
Note: Do not manipulate the UI directly in child threads
{ .......
///How the child threads update the UI (important) to avoid problems with the code. Eg: Download progress update///The UI thread is called the main thread, and the other threads that are created are called working sub-threads, note: Do not manipulate the UI directly in a child thread (to make the main thread manipulate the UI indirectly)_progressview =[[uiprogressview Alloc] Initwithframe:cgrectmake ( -, $, -,Ten)]; [Self.view Addsubview:_progressview]; [Nsthread detachnewthreadselector: @selector (downloadnetworkingdata) totarget:self Withobject:nil]; }#pragmaMark--Demo Download Data-(void) downloadnetworkingdata{//analog 10s Network download for(intI=0; i< -; i++) { //_progressview.progress +=0.01; Do not operate the UI interface here//The following statement is the process of indirectly manipulating the UI[Self performselectoronmainthread: @selector (UpdateUI) Withobject:nil Waituntildone:yes]; [Nsthread sleepfortimeinterval:0.1]; }}-(void) updateui{_progressview.progress+=0.01;}
Second, nsopetation
1. What is Nsoperation
is also a mechanism to implement multithreading, in Nsthread do a higher abstraction, joined the block, more than nsthread easy to use
Third, GCD
1. Grand Central Dispatch Shorthand
Advantages: Support multi-core, C and block interface, easy to use, powerful.
1. Create an asynchronous task [self creatasynctask];2. analog network download [self simulatenewokingdownload];3. Just execute once [self runOnce]; 4。 Delay execution [self delayrun]; 5Notifications perform multiple tasks, waiting for all tasks to be processed when execution is complete [self grouprun]; ===============-(void) grouprun{//group Task Group dispatch_group_t Group =Dispatch_group_create (); Add task, 7 seconds to complete Dispatch_group_async (group, Dispatch_get_global_queue (Dispatch_queue_priority_default, 0), ^{//for (int i=0; i<100; i++) {NSLog (@ "a=%d"), i); [Nsthread sleepfortimeinterval:0.07]; } }); Add task, 5 Seconds to complete Dispatch_group_async (group, Dispatch_get_global_queue (Dispatch_queue_priority_default, 0), ^{//for (int i=0; i<100; i++) {NSLog (@ "b=%d"), i); [Nsthread sleepfortimeinterval:0.05]; } }); Add task, 10 seconds to complete Dispatch_group_async (group, Dispatch_get_global_queue (Dispatch_queue_priority_default, 0), ^{//for (int i=0; i<100; i++) {NSLog (@ "c=%d"), i); [Nsthread sleepfortimeinterval:0.1]; }});//monitoring completed Operation Dispatch_group_notify (group, Dispatch_get_global_queue (Dispatch_queue_priority_default, 0), ^{NSLog (@ "All Tasks completed"); });} -(void) delayrun{//5s after output dispatch_after (Dispatch_time (Dispatch_time_now, (int64_t) (5*nsec_per_sec)), Dispatch_get_main_ Queue (), ^{//NSLog (@ "haha")); });} -(void) runonce{Staticdispatch_once_t Oncetoken; Dispatch_once (&oncetoken, ^{NSLog (@ "Execute code only once");});} -(void) simulatenewokingdownload{_progressview =[[uiprogressview alloc] Initwithframe:cgrectmake (50, 200, 250, 10)]; [Self.view Addsubview:_progressview]; Dispatch_async (Dispatch_get_global_queue (dispatch_queue_priority_default, 0), ^ {for (int i=0; i<10; i++ ) {////Last Show Dialog Dispatch_async (Dispatch_get_main_queue (), ^ {_progre Ssview.progress +=0.1 ;}); [Nsthread sleepfortimeinterval:1 ];} Dispatch_async (Dispatch_get_main_queue (), ^ {uialertview *alertview = [[Uialertview alloc] init]; Alertview.message [email protected] "Download Done" ; [Alertview addbuttonwithtitle:@ "Cancel" ]; [Alertview show]; }); });} #pragma mark--gcd test Method-(void ) creatasynctask{//Create an asynchronous task, parameter 1, incoming queue, 3 Queue:main Queue Home column, global queue A worker thread; custom Queue dispatch_queue_t queue=dispatch_get_global_queue (dispatch_queue_priority_default, 0 ); dispatch _async (Queue, ^ {for (int i=0; i<20; i++ ) {NSLog (@ "a===%d" , I);}}); Dispatch_async (queue, ^ { for (int i=0; i<20; i++ ) {NSLog (@ "b===%d" , I);}});
iOS Multi-Threading