創(chuàng)建信號(hào)量的方式:
目前創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、蒼南網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
(1)dispatch_semaphore_creat SignalCount = dispatch_semaphore_creat(10).
這個(gè)地方后面的這個(gè)10,是一個(gè)整數(shù),可以是1,2,3,。。。表示在信號(hào)等待的時(shí)候,下一次收到的的信號(hào)量,說(shuō)白了,就是這個(gè)數(shù)字控制的最大并發(fā)數(shù)。
(2)dispatch_semaphore_signal( ),這是一句表示信號(hào)通知。表示在信號(hào)等待的時(shí)候,收到的下一個(gè)信號(hào)量。一般是一個(gè)“信號(hào)量對(duì)象”。
(3)dispatch_semaphore_wait(參數(shù)一,參數(shù)二 ),這一句表示信號(hào)等待。
一般參數(shù)一會(huì)放一個(gè)信號(hào)對(duì)象,就是我們建立的那個(gè),如果這個(gè)對(duì)列的信號(hào)量小于0的時(shí)候,就會(huì)一直等待下去。
參數(shù)二的值一般是 DISPATCH_TIME_FOREVER 和 DISPATCH_TIME_NOW
下面我們寫(xiě)一段代碼來(lái)說(shuō)明一下。(注:當(dāng)然是參考別人的)
這個(gè)地方,解釋一下,新建一個(gè)信號(hào)量為10的對(duì)象,就是將隊(duì)列的最大并發(fā)數(shù)控制在10。
第一次打印的結(jié)果是 0,1,2,3,4,5,6,7,8,9。十個(gè)數(shù)字。
最關(guān)鍵的是dispatch_semaphore_signal(semphore),如果打印完第一輪十個(gè)數(shù)字,不再進(jìn)行信號(hào)通知的話,線程就永遠(yuǎn)阻塞下去咯。剩下的10~99就不會(huì)再打印下去。
(注:以上是看了一個(gè)大神地思路以后,自己擺弄了一下,然后給大家解釋一下,感謝那位大神,有些公司去面試的時(shí)候,會(huì)問(wèn)NSOperation這個(gè)類通過(guò)調(diào)用setMaxConcurrentOperationCount這個(gè)方法設(shè)置最大的并發(fā)數(shù),多線程技術(shù)GCD可以嗎?答案是可以的,還有之前看過(guò)另外一個(gè)大神的,通過(guò)信號(hào)量控制,將異步的線程變成同步線程的,有興趣的同學(xué)可以去參閱以下)。
線程的不安全是由于多線程訪問(wèn)和修改共享資源而引起的不可預(yù)測(cè)的結(jié)果。
ios多線程開(kāi)發(fā)中為保證線程的安全常用到的幾種鎖: NSLock 、 dispatch_semaphore 、 NSCondition 、 NSRecursiveLock 、 @synchronized 。
WEAKSELF typeof(self) __weak weakSelf = self;
NSLock 是OC層封裝底層線程操作來(lái)實(shí)現(xiàn)的一種鎖,繼承NSLocking協(xié)議。不能迭代加鎖,如果發(fā)生兩次lock,而未unlock過(guò),則會(huì)產(chǎn)生死鎖問(wèn)題。
以車站購(gòu)票為例,多個(gè)窗口同時(shí)售票(同步),每個(gè)窗口有人循環(huán)購(gòu)票:
原子操作
原子操作是指不可打斷的操作,也就是說(shuō)線程在執(zhí)行操作的過(guò)程中,不會(huì)被操作系統(tǒng)掛起,而是一定會(huì)執(zhí)行完,
變量屬性Property中的原子定義
一般我們定義一個(gè)變量@property (nonatomic ,strong)NSLock *lock;nonatomic:非原子性,不會(huì)為setter方法加鎖,適合內(nèi)存小的移動(dòng)設(shè)備;atomic:原子性,默認(rèn)為setter方法加鎖(默認(rèn)就是atomic),線程安全。
PS: 在iOS開(kāi)發(fā)過(guò)程中,一般都將屬性聲明為nonatomic,盡量避免多線程搶奪同一資源,盡量將加鎖等資源搶奪業(yè)務(wù)交給服務(wù)器。
NSCondition常用于生產(chǎn)者-消費(fèi)者模式,它繼承了NSLocking協(xié)議,同樣有l(wèi)ock和unlock方法。條件變量有點(diǎn)像信號(hào)量,提供了線程阻塞和信號(hào)機(jī)制,因此可以用來(lái)阻塞某個(gè)線程,并等待數(shù)據(jù)就緒再喚醒程序。
信號(hào)量主要有3個(gè)函數(shù),分別是:
注意: 正常的使用順序是先降低然后提高,這兩個(gè)函數(shù)通常都是成對(duì)出現(xiàn)。
本文主要參考了這篇文章(
),并對(duì)其中所能理解的部分進(jìn)行一一驗(yàn)證,以前沒(méi)怎么寫(xiě)過(guò)類似的,如果有什么做的不好的地方還請(qǐng)大家多多見(jiàn)諒!
線程和進(jìn)程在我們開(kāi)發(fā)中,跟我們一直形影不離,那么什么是進(jìn)程,什么是線程,它們又有什么關(guān)系,這篇文章將為您簡(jiǎn)單介紹。
線程概念
進(jìn)程概念
地址空間:同?進(jìn)程的線程共享本進(jìn)程的地址空間( TLS是本地的線程棧存空間,線程的局部空間是某些操作系統(tǒng)為線程提供的私有空間,只具備有限的容量,并不屬于線程,由操作系統(tǒng)單獨(dú)安排的 ),?進(jìn)程之間則是獨(dú)?的地址空間。
資源擁有:同?進(jìn)程內(nèi)的線程共享本進(jìn)程的資源如內(nèi)存、I/O、cpu等,但是進(jìn)程之間的資源是獨(dú)?的。
優(yōu)點(diǎn):
缺點(diǎn):
時(shí)間?的概念:CPU在多個(gè)任務(wù)直接進(jìn)?快速的切換,這個(gè)時(shí)間間隔就是時(shí)間?。
多線程同時(shí)執(zhí)行
如果線程非常多
互斥鎖?結(jié)
互斥鎖參數(shù)
nonatomic?原?屬性
atomic原?屬性(線程安全),針對(duì)多線程設(shè)計(jì)的,默認(rèn)值,保證同?時(shí)間只有?個(gè)線程能夠?qū)?(但是同?個(gè)時(shí)間多個(gè)線程都可以取值)
atomic本身就有?把鎖(?旋鎖)
單寫(xiě)多讀:?jiǎn)蝹€(gè)線程寫(xiě)?,多個(gè)線程可以讀取
atomic:線程安全,需要消耗?量的資源
nonatomic:?線程安全,適合內(nèi)存?的移動(dòng)設(shè)備
iOS開(kāi)發(fā)建議
所有屬性都聲明為nonatomic
盡量避免多線程搶奪同一塊資源
盡量將加鎖,資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器處理,減少APP的壓力
這篇文章簡(jiǎn)單介紹了線程與進(jìn)程的概念,煩請(qǐng)大家不吝賜教。
在多線程開(kāi)發(fā)中,我們常用到GCD,這里探討一下GCD任務(wù)的取消:
1.在iOS 8以后,系統(tǒng)給我們提供了這樣的取消函數(shù) dispatch_block_cancel,不過(guò)這個(gè)也只能用于dispatch_block_create創(chuàng)建的dispatch_block_t,我們?cè)囼?yàn)一下:
這時(shí)肯定是任務(wù)都會(huì)執(zhí)行的
接下來(lái),把注釋的那一行 dispatch_block_cancel(block1);打開(kāi),看看效果:
我們發(fā)現(xiàn)block1確實(shí)被取消掉了。這是dispatch_block_cancel的用法。
2.很多時(shí)候,我們的場(chǎng)景不會(huì)去用dispatch_block_create創(chuàng)建dispatch_block_t,這個(gè)時(shí)候我們?nèi)粝肴∠粋€(gè)任務(wù),可以考慮用一個(gè)條件來(lái)做,滿足條件則執(zhí)行此任務(wù),不滿足則不執(zhí)行,舉個(gè)例子:
效果如下:
寫(xiě)到這里,這兒其實(shí)還隱藏了一個(gè)知識(shí)點(diǎn),就是block的變量捕獲,有興趣或是不理解的朋友可以研究一下。(如下,為何輸出不是20而是10)
3.過(guò)渡到NSOperation
NSOperation是對(duì)GCD的封裝,底層也是GCD。
NSOperation給我們封裝了更多的api,這是我在Xcode中提出來(lái)的:
我們可以發(fā)現(xiàn)它有狀態(tài)屬性,有取消方法,也有添加依賴方法等...這里我們還是先說(shuō)取消吧,下面來(lái)給大家寫(xiě)個(gè)demo:
這時(shí)輸出是:
因?yàn)檎趫?zhí)行的任務(wù),NSOperation也是不能取消的,所以也是需要將cancel在start前調(diào)用的(就如同滿足一個(gè)條件是否需要cancel一樣,也可以滿足條件不調(diào)用start)
你知道嗎?IOS軟件工程師已經(jīng)成為軟件人才中的緊缺型人才!
國(guó)內(nèi)外出現(xiàn)大量的“IOS人才荒”,未來(lái)幾年IOS人才需求缺口將達(dá)百萬(wàn)!
招聘網(wǎng)站上,IOS軟件工程師依然成為各大企業(yè)哄搶的對(duì)象,不少企業(yè)為招聘這類人才,不惜花重金招攬,騰訊、聯(lián)想、新浪等國(guó)內(nèi)企業(yè)也毫不例外地爭(zhēng)奪IOS軟件工程師,很多IOS開(kāi)發(fā)崗位年薪已高達(dá)幾十萬(wàn)!
課程內(nèi)容
內(nèi)容介紹
預(yù)備階段
1、文件管理器Finder
2、iWork使用Numbers,Keynote,Pages
3、Safari瀏覽器
?
?
MacOs的使用,iWork的使用
iOS開(kāi)發(fā)基礎(chǔ)
1、iOS開(kāi)發(fā)的系統(tǒng)環(huán)境介紹、Xcode集成開(kāi)發(fā)環(huán)境詳解、常用軟件的介紹
2、數(shù)據(jù)類型、常量和變量、運(yùn)算符、賦值語(yǔ)句和表達(dá)式;分支、循環(huán)
3、函數(shù),數(shù)組(一維數(shù)組、二維數(shù)組、多維數(shù)組),結(jié)構(gòu)體
4、指針數(shù)組、數(shù)組指針,結(jié)構(gòu)體指針
5、指向指針的指針,宏定義、枚舉,const,static
?
?
?
1、Xcode、SVN
2、C語(yǔ)言是iOS開(kāi)發(fā)的入門基礎(chǔ)語(yǔ)言,本部分主要介紹C語(yǔ)言的基本語(yǔ)法,程序結(jié)構(gòu),以及指針的各種操作。
為接下來(lái)Objective-C語(yǔ)言的學(xué)習(xí)打下基礎(chǔ)。
?
1、面向?qū)ο螅∣OP)和面向過(guò)程、類(Class)和對(duì)象(Object)、類的定義
2、創(chuàng)建對(duì)象、self和super關(guān)鍵字、屬性以及點(diǎn)語(yǔ)法(nonatomic,assign、retain、copy,readonly、readwrite)
3、便利構(gòu)造器、單例(Singleton)
4、堆棧、內(nèi)存管理(alloc、copy、retain,release、autorelease,strong、weak)
5、鍵值編碼(KVC)、鍵值監(jiān)聽(tīng)(KVO)、通知(NSNotification)
6、類目(Category)、延展(Extention)、協(xié)議(protocol)
?
?
?
?
?
?
?
Objective-C是iOS與MacOS開(kāi)發(fā)的主要語(yǔ)言,它是對(duì)C語(yǔ)言的擴(kuò)展,并融入了面向?qū)ο蟮奶攸c(diǎn)。
包含封裝、繼承、多態(tài)三大特性,本部分主要介紹OC的基本語(yǔ)法,新的特性,內(nèi)存管理等內(nèi)容
?
1、字符串(NSStringNSMutableString)、數(shù)值對(duì)象(NSNumberNSValue)
2、數(shù)組(NSArray,NSMutableArray)、字典(NSDictionary,NSMutableDictionary)、集合(NSSet,NSMutableSet)、快速枚舉(for?in)NSIndexPath
3、日期與時(shí)間(NSDate)、日期格式(NSDataFormatter)、日歷(NSCalendar)、定時(shí)器(NSTimer)
4、文件管理(NSFileManager)、程序包(NSBundle)、緩沖區(qū)(NSData)
5、網(wǎng)絡(luò)連接(NSURLConnection)、網(wǎng)絡(luò)地址(NSURL)、網(wǎng)絡(luò)請(qǐng)求(NSURLRequest)、請(qǐng)求回應(yīng)(NSResponse)、錯(cuò)誤信息處理(N0SError)
6、MVC編程,簡(jiǎn)單控件一:標(biāo)簽(UILabel)、文本輸入(UITextField)、按鈕(UIButton)、提示框(UIAlertView、UIActionSheet
7、使用面向?qū)ο驩OP方法,實(shí)施計(jì)算機(jī)APP應(yīng)用.要求學(xué)員應(yīng)用前期學(xué)習(xí)中的大部分知識(shí)點(diǎn)
?
?
?
?
?
iOS的基礎(chǔ)框架,包含了iOS開(kāi)發(fā)的基本數(shù)據(jù)類型,在iOSSDK中幾乎部NS開(kāi)頭的類都屬于這個(gè)框架,我們將詳細(xì)介紹開(kāi)發(fā)中常用的類。
iOS開(kāi)發(fā)
1、窗口(UIWindow)、視圖(UIView)、應(yīng)用程序(UIApplication)
2、繪圖(drawRect)、QuartzCoreDemo、CGContextRef
3、觸摸(UITouch)、事件(UIEvent)、手勢(shì)(UIGestureRecognizer)、UIResponder、消息傳遞、響應(yīng)者鏈
4、UIView以及CALayer動(dòng)畫(huà)(CAAnimation、CABasicAnimation、CAKeyFrameAnimation)
5、活動(dòng)提示(UIActivityIndicatorView)、圖像(UIImageView)
6、控件二:滾動(dòng)視圖(UIScrollView)、頁(yè)控制器(UIPageControl)、開(kāi)關(guān)(UISwitch)、單選(UISegmentControl)、滑塊(UISlider)
7、控件三:多行文本(UITextView)、網(wǎng)頁(yè)視圖(UIWebView)、滾輪(UIPickerView)、日期滾輪(UIDatePickerView)、表格視圖(UITableView)、表格項(xiàng)(UITableViewCell)
8、視圖控制器(UIViewController)、導(dǎo)航控制器(UINavigationController)、標(biāo)簽控制器(UITabBarController)、表格控制器(UITableViewController)、相冊(cè)控制器(UIImagePickerController)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
UIKit處于Cocoa四層結(jié)構(gòu)的上層CocoaTouch層,是iOS開(kāi)發(fā)中的控件框架,定義了幾乎部可視化控件,在iOS開(kāi)發(fā)中占據(jù)地位,我們不會(huì)學(xué)習(xí)各個(gè)控件的用法,而且會(huì)講述各個(gè)控件在不同版本系統(tǒng)里的樣式,教大家如何自定義控件樣式。
學(xué)完他們我們就可以做自己個(gè)性化的界面了。
結(jié)合前期所學(xué)知識(shí),應(yīng)用UIKit框架詳解中所學(xué)的UI控件及知識(shí)點(diǎn),模擬實(shí)現(xiàn)Safari瀏覽器
iPhoneSafari瀏覽器原型App。
1、音頻播放(AVAudioPlayer)、視頻播放(MPMoviePlayerViewController)以及播放ipod音樂(lè)
2、照相機(jī)(UIImagePickerController)以及相冊(cè)的使用
3、短信(MFMessageComposeViewController)、郵件(MFMailComposeViewController)的使用
4、加速計(jì)(UIAccelerometer)的使用、帳號(hào)注冊(cè)、真機(jī)調(diào)試、上傳程序
5、地圖(MKMapView)的使用以及定位(CoreLocation)
6、數(shù)據(jù)持久化(文件讀寫(xiě)、sqlite數(shù)據(jù)庫(kù)、歸檔、NSCoding協(xié)議)、云存儲(chǔ)(iCloud)
7、多線程開(kāi)發(fā)(NSThread、NSLock),操作隊(duì)列(NSOperationQueue)
8、網(wǎng)絡(luò)請(qǐng)求(GET、POST)、xml解析、json解析、Socket編程
?
iOS應(yīng)用特性框架是對(duì)上述兩個(gè)框架之外其他框架的統(tǒng)稱。
主要課程內(nèi)容為:音頻、視頻的播放、照相機(jī)的使用、加速計(jì)的應(yīng)用,地圖框架的使用、短信、郵件的應(yīng)用等等,而且也會(huì)介紹當(dāng)前應(yīng)用開(kāi)發(fā)中使用非常廣泛的開(kāi)源框架,同時(shí)還將講解開(kāi)發(fā)者帳號(hào)的注冊(cè)、真機(jī)調(diào)試、以及程序上傳。
iOS游戲開(kāi)發(fā)
1、Cocos2DHelloWorld,CCDirector(導(dǎo)演類),CCScene(場(chǎng)景類),CCLayer
2、CCSprite(精靈類),CCAction(動(dòng)作)
3、CCMemu(菜單),CCLabelTTF(標(biāo)簽)
4、CCPointParticleSystem(點(diǎn)粒子系統(tǒng))
5、練習(xí):植物大戰(zhàn)僵尸游戲開(kāi)發(fā)
?
2D游戲引擎的使用,部課程內(nèi)容以"植物大戰(zhàn)僵尸"為例,貫穿其中
1、在Xcode下編譯C++程序,C++類Class,成員變量,成員函數(shù),對(duì)象的創(chuàng)建
2、構(gòu)造函數(shù)與析構(gòu)函數(shù),newdelete關(guān)鍵字,內(nèi)存管理
3、繼承,函數(shù)重載,操作符重載,拷貝構(gòu)造
4、模版template與泛型
5、Objective-C與C++混合編程
?
C++是目前流行的開(kāi)發(fā)語(yǔ)言之一,C++基本語(yǔ)法,C++面象對(duì)像的特性.在XCode下如何使用C++語(yǔ)言編程.
1、物理世界(b2World),剛體(b2Body),精靈與剛體連接
2、碰撞測(cè)試(b2ContactListener)
3、剛體的連接關(guān)節(jié)(b2Joint)
4、練習(xí):憤怒的小鳥(niǎo)開(kāi)發(fā)
5、OpenGLES開(kāi)發(fā)基礎(chǔ)
?
iOS游戲開(kāi)發(fā)中使用多的物理引擎,以憤怒的小鳥(niǎo)為例學(xué)習(xí)Box2D開(kāi)發(fā).
項(xiàng)目實(shí)訓(xùn)
項(xiàng)目會(huì)用到網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)、各種常用控件、以及各種Foundation類。
目前有很多項(xiàng)目可以選擇使用,比如:互動(dòng)百科(新聞?lì)悜?yīng)用)、樂(lè)視(電影類應(yīng)用)、創(chuàng)業(yè)邦(雜志類應(yīng)用)、尚品網(wǎng)(購(gòu)物類應(yīng)用)、雅座空間(團(tuán)購(gòu)類應(yīng)用)、找地(定位類應(yīng)用)、我是數(shù)學(xué)家(教育類應(yīng)用)、YY客戶端(語(yǔ)音類應(yīng)用)、麥咨達(dá)(條碼掃描類應(yīng)用)、中國(guó)建行(銀行類應(yīng)用)、CuteMath(游戲類應(yīng)用)、車震搖搖樂(lè)(娛樂(lè)類應(yīng)用)、新浪微博(微博類應(yīng)用)等等
老師程帶領(lǐng)學(xué)生做一個(gè)真實(shí)項(xiàng)目,從需求分析開(kāi)始帶起,然后技術(shù)調(diào)研,工期評(píng)估、編碼、測(cè)試、優(yōu)化代碼、上傳程序等項(xiàng)目?jī)?nèi)容會(huì)包括幾點(diǎn):網(wǎng)絡(luò)數(shù)據(jù)解析、團(tuán)隊(duì)協(xié)調(diào)、版本管理、制作文檔、復(fù)雜表布局、制作CELL類、動(dòng)畫(huà)應(yīng)用、定位、方向地址解析、百度地圖應(yīng)用
新聞標(biāo)題:ios多線程開(kāi)發(fā),ios什么時(shí)候用到多線程
本文URL:http://jinyejixie.com/article46/dsecihg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、自適應(yīng)網(wǎng)站、企業(yè)網(wǎng)站制作、網(wǎng)站制作、網(wǎng)站導(dǎo)航、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)