十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
全局登錄button
創(chuàng)新互聯(lián)公司從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元原陽做網(wǎng)站,已為上家服務(wù),為原陽各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575
1.1需要在- (void)viewWillAppear:(BOOL)animated方法添加通知中心
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//添加通知中心
//添加文本框通知中心
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gosave:) name:UITextFieldTextDidChangeNotification object:nil];
//selector是選擇器,Observer是觀察者,name是檢測的類型 object填nil就行
//這里檢測的是文本框text值改變的時候,另外還可以檢測:
UITextFieldTextDidBeginEditingNotification;開始編輯時
UITextFieldTextDidEndEditingNotification;結(jié)束編輯時
UITextFieldTextDidChangeNotification;值改變時
}
1.2在當(dāng)前視圖控制器的.m中實(shí)現(xiàn)gosave方法
- (void)gosave:(NSNotification *) Notification{
UITextField * textField = Notification.object;
if (self.phoneTextFld.text.length == 11 self.codeTextFld.text.length == 4 [XSTTools judgeWithPhone:self.phoneTextFld.text andWithPwd:nil andWithCode:self.codeTextFld.text andShowView:self.view]) {
//這個if判斷是我自己項(xiàng)目需求寫的,你可以根據(jù)自己項(xiàng)目來寫,只需要在滿足條件的時候?qū)utton的selected設(shè)置為YES不滿足條件設(shè)置為NO即可
self.loginButton.selected = YES;
self.loginButton.userInteractionEnabled = YES;
}else{
1.3移除通知中心
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
//移除通知中心
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
[self.timer invalidate];
}
1.當(dāng)然上面只是一個很小的用法,你可以擴(kuò)展其他用法,比如還可以檢測鍵盤的高度來實(shí)現(xiàn)對uikit控件的frame上移和下拉。這個用法主要用在當(dāng)textField文本框被彈出鍵盤遮擋時。
ps:需要注意的是:
1.1添加通知中心一定要寫在視圖即將顯示的方法-(void)viweWillApper:(animated)里面,不能寫在-(void)viewDidLoad里面。
1.2視圖即將消失的時候?qū)⑼ㄖ行囊瞥?,不然會有?nèi)存泄露。
因?yàn)椋簐iewDidLoad只會在UIViewController的實(shí)例化對象push或者present的時候執(zhí)行一次。所以當(dāng)我們返回這個視圖的時候通知中心已經(jīng)移除了,就會出錯。
text ? ?設(shè)置文本顯示內(nèi)容
backgroundColor ? ? 設(shè)置背景色
scrollEnabled ? ? 當(dāng)文本內(nèi)容超出視圖邊框時是否允許滑動, 默認(rèn)為YES
editable ? ? 設(shè)置是否允許編輯文本內(nèi)容 默認(rèn)為YES(可編輯)
delegate ? ? 設(shè)置代理方法的實(shí)現(xiàn)類
font ? ? 設(shè)置字體名字和大小
returnKeyType ? ? 設(shè)置鍵盤上的return鍵的類型
keyboardType ? ? 鍵盤類型
textAlignment ? ?文本內(nèi)容居左還是居中還是居右
dataDetectorTypes????顯示數(shù)據(jù)類型的連接模式(如電話號碼、網(wǎng)址、地址等)
textColor ? ?設(shè)置文本內(nèi)容字體顏色
autocapitalizationType ? ?輸入類型
autocorrectionType ? ?是否自動更正
secureTextEntry ????安全文本輸入
keyboardAppearance ????鍵盤外觀
- (BOOL)textViewShouldBeginEditing:(UITextView*)textView; ? ?將要開始編輯
- (BOOL)textViewShouldEndEditing:(UITextView*)textView; ? ??將要結(jié)束編輯
- (void)textViewDidBeginEditing:(UITextView*)textView; ? ??開始編輯
- (void)textViewDidEndEditing:(UITextView*)textView; ? ??結(jié)束編輯
- (BOOL)textView:(UITextView*)textViewshouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text; ? ??內(nèi)容將要發(fā)生改變編輯
?- (void)textViewDidChange:(UITextView*)textView; ? ??內(nèi)容發(fā)生改變編輯
- (void)textViewDidChangeSelection:(UITextView*)textView; ? ??焦點(diǎn)發(fā)生改變
4.?UITextView限制字?jǐn)?shù)
ios的開發(fā)框架有很多,常用的框架有Foundation、UIKit、CoreData和CoreGraphics等。
Foundation框架可以為所有的應(yīng)用程序提供基本系統(tǒng)服務(wù);UIKit提供了在屏幕上繪制的機(jī)制,捕獲事件,和創(chuàng)建通用用戶界面元素,所有的iOS應(yīng)用程序都基于UIKit。
CoreData提供對象的管理,使用CoreData,可以創(chuàng)建模型對象并管理這些對象;高質(zhì)量的圖形對于所有的iOS應(yīng)用程序很重要,CoreGraphics則提供了更底層的庫來幫助創(chuàng)建復(fù)雜圖形。
總結(jié):
ios的開發(fā)框架有很多,常用的框架有Foundation、UIKit、CoreData和CoreGraphics等。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:0731-84117792E-MAIL:11247931@qq.com
cocoa與cocoa
Touch區(qū)別之分
相同之處:兩者都包含OC運(yùn)行時的兩個核心框架:
cocoa包含
Foundation
和AppKit框架,可用于開發(fā)Mac
OS
X系統(tǒng)
的應(yīng)用程序
cocoa
touch包含F(xiàn)oundation和UIKit框架,可用于開發(fā)iPhone
OS
系統(tǒng)的應(yīng)用程序
Cocoa時Mac
OS
X...
阿里妹導(dǎo)讀:剛剛,阿里巴巴正式對外開源了基于 Apache 2.0 協(xié)議的協(xié)程開發(fā)框架 coobjc,開發(fā)者們可以在 Github 上自主下載。
coobjc是為iOS平臺打造的開源協(xié)程開發(fā)框架,支持Objective-C和Swift,同時提供了cokit庫為Foundation和UIKit中的部分API提供了 協(xié)程 化支持,本文將為大家詳細(xì)介紹coobjc的設(shè)計(jì)理念及核心優(yōu)勢。
從2008年第一個iOS版本發(fā)布至今的11年時間里,iOS的異步編程方式發(fā)展緩慢。
基于 Block 的異步編程回調(diào)是目前 iOS 使用最廣泛的異步編程方式,iOS 系統(tǒng)提供的 GCD 庫讓異步開發(fā)變得很簡單方便,但是基于這種編程方式的缺點(diǎn)也有很多,主要有以下幾點(diǎn):
針對多線程以及尤其引發(fā)的各種崩潰和性能問題,我們制定了很多編程規(guī)范、進(jìn)行了各種新人培訓(xùn),嘗試降低問題發(fā)生的概率,但是問題依然很嚴(yán)峻,多線程引發(fā)的問題占比并沒有明顯的下降,異步編程本來就是很復(fù)雜的事情,單靠規(guī)范和培訓(xùn)是難以從根本上解決問題的,需要有更加好的編程方式來解決。
上述問題在很多系統(tǒng)和語言開發(fā)中都可能會碰到,解決問題的標(biāo)準(zhǔn)方式就是使用協(xié)程,C#、Kotlin、Python、Javascript 等熱門語言均支持協(xié)程極其相關(guān)語法,使用這些語言的開發(fā)者可以很方便的使用協(xié)程及相關(guān)功能進(jìn)行異步編程。
2017 年的 C++ 標(biāo)準(zhǔn)開始支持協(xié)程,Swift5 中也包含了協(xié)程相關(guān)的標(biāo)準(zhǔn),從現(xiàn)在的發(fā)展趨勢看基于協(xié)程的全新的異步編程方式,是我們解決現(xiàn)有異步編程問題的有效的方式,但是蘋果基本已經(jīng)不會升級 Objective-C 了,因此使用Objective-C的開發(fā)者是無法使用官方的協(xié)程能力的,而最新 Swift 的發(fā)布和推廣也還需要時日,為了讓廣大iOS開發(fā)者能快速享受到協(xié)程帶來的編程方式上的改變,手機(jī)淘寶架構(gòu)團(tuán)隊(duì)基于長期對系統(tǒng)底層庫和匯編的研究,通過匯編和C語言實(shí)現(xiàn)了支持 Objective-C 和 Swift 協(xié)程的完美解決方案 —— coobjc。
核心能力
內(nèi)置系統(tǒng)擴(kuò)展庫
coobjc設(shè)計(jì)
最底層是協(xié)程內(nèi)核,包含了棧切換的管理、協(xié)程調(diào)度器的實(shí)現(xiàn)、協(xié)程間通信channel的實(shí)現(xiàn)等。
中間層是基于協(xié)程的操作符的包裝,目前支持async/await、Generator、Actor等編程模型。
最上層是對系統(tǒng)庫的協(xié)程化擴(kuò)展,目前基本上覆蓋了Foundation和UIKit的所有IO和耗時方法。
核心實(shí)現(xiàn)原理
協(xié)程的核心思想是控制調(diào)用棧的主動讓出和恢復(fù)。一般的協(xié)程實(shí)現(xiàn)都會提供兩個重要的操作:
我們基于線程的代碼執(zhí)行時候,是沒法做出暫停操作的,我們現(xiàn)在要做的事情就是要代碼執(zhí)行能夠暫停,還能夠再恢復(fù)。 基本上代碼執(zhí)行都是一種基于調(diào)用棧的模型,所以如果我們能把當(dāng)前調(diào)用棧上的狀態(tài)都保存下來,然后再能從緩存中恢復(fù),那我們就能夠?qū)崿F(xiàn)yield和 resume。
實(shí)現(xiàn)這樣操作有幾種方法呢?
上述第三種和第四種只是能過做到跳轉(zhuǎn),但是沒法保存調(diào)用棧上的狀態(tài),看起來基本上不能算是實(shí)現(xiàn)了協(xié)程,只能算做做demo,第五種除非官方支持,否則自行改寫編譯器通用性很差。而第一種方案的 ucontext 在iOS上是廢棄了的,不能使用。那么我們使用的是第二種方案,自己用匯編模擬一下 ucontext。
模擬ucontext的核心是通過getContext和setContext實(shí)現(xiàn)保存和恢復(fù)調(diào)用棧。需要熟悉不同CPU架構(gòu)下的調(diào)用約定(Calling Convention). 匯編實(shí)現(xiàn)就是要針對不同cpu實(shí)現(xiàn)一套,我們目前實(shí)現(xiàn)了 armv7、arm64、i386、x86_64,支持iPhone真機(jī)和模擬器。
說了這么多,還是看看代碼吧,我們從一個簡單的網(wǎng)絡(luò)請求加載圖片功能來看看coobjc到底是如何使用的。
下面是最普通的網(wǎng)絡(luò)請求的寫法:
下面是使用coobjc庫協(xié)程化改造后的代碼:
原本需要20行的代碼,通過coobjc協(xié)程化改造后,減少了一半,整個代碼邏輯和可讀性都更加好,這就是coobjc強(qiáng)大的能力,能把原本很復(fù)雜的異步代碼,通過協(xié)程化改造,轉(zhuǎn)變成邏輯簡潔的順序調(diào)用。
coobjc還有很多其他強(qiáng)大的能力,本文對于coobjc的實(shí)際使用就不過多介紹了,感興趣的朋友可以去官方github倉庫自行下載查看。
我們在iPhone7 iOS11.4.1的設(shè)備上使用協(xié)程和傳統(tǒng)多線程方式分別模擬高并發(fā)讀取數(shù)據(jù)的場景,下面是兩種方式得到的壓測數(shù)據(jù)。
從上面的表格我們可以看到使用在并發(fā)量很小的場景,由于多線程可以完全使用設(shè)備的計(jì)算核心,因此coobjc總耗時要比傳統(tǒng)多線程略高,但是由于整體耗時都很小,因此差異并不明顯,但是隨著并發(fā)量的增大,coobjc的優(yōu)勢開始逐漸體現(xiàn)出來,當(dāng)并發(fā)量超過1000以后,傳統(tǒng)多線程開始出現(xiàn)線程分配異常,而導(dǎo)致很多并發(fā)任務(wù)并沒有執(zhí)行,因此在上表中顯示的是大于20秒,實(shí)際是任務(wù)已經(jīng)無法正常執(zhí)行了,但是coobjc仍然可以正常運(yùn)行。
我們在手機(jī)淘寶這種超級App中嘗試了協(xié)程化改造,針對部分性能差的頁面,我們發(fā)現(xiàn)在滑動過程中存在很多主線程IO調(diào)用、數(shù)據(jù)解析,導(dǎo)致幀率下降嚴(yán)重,通過引入coobjc,在不改變原有業(yè)務(wù)代碼的基礎(chǔ)上,通過全局hook部分IO、數(shù)據(jù)解析方法,即可讓原來在主線程中同步執(zhí)行的IO方法異步執(zhí)行,并且不影響原有的業(yè)務(wù)邏輯,通過測試驗(yàn)證,這樣的改造在低端機(jī)(iPhone6及以下的機(jī)器)上的幀率有20%左右的提升。
簡明
易用
清晰
性能
程序是寫來給人讀的,只會偶爾讓機(jī)器執(zhí)行一下。——Abelson and Sussman
基于協(xié)程實(shí)現(xiàn)的編程范式能夠幫助開發(fā)者編寫出更加優(yōu)美、健壯、可讀性更強(qiáng)的代碼。
協(xié)程可以幫助我們在編寫并發(fā)代碼的過程中減少線程和鎖的使用,提升應(yīng)用的性能和穩(wěn)定性。
本文作者:淘寶技術(shù)