Uygulamanızı Daha Performanslı Hissetmek için iOS Performans Püf Noktaları

Yayınlanan: 2022-03-10
Kısa özet ↬ İyi performans, iyi bir kullanıcı deneyimi sunmak için çok önemlidir ve iOS kullanıcıları, uygulamalarından genellikle yüksek beklentilere sahiptir. Yavaş ve yanıt vermeyen bir uygulama, kullanıcıların uygulamanızı kullanmaktan vazgeçmesine veya daha da kötüsü kötü bir puan bırakmasına neden olabilir.

Modern iOS donanımı birçok yoğun ve karmaşık görevi yerine getirecek kadar güçlü olsa da, uygulamanızın nasıl performans gösterdiğine dikkat etmezseniz cihaz yine de yanıt vermeyebilir. Bu yazıda, uygulamanızın daha duyarlı hissetmesini sağlayacak beş optimizasyon hilesine bakacağız.

1. Yeniden Kullanılabilir Hücreyi Kuyruktan Çıkarın

Muhtemelen daha önce tableView(_:cellForRowAt:) tableView.dequeueReusableCell(withIdentifier:for:) kullanmışsınızdır. Bir dizi hücreyi içeri aktarmak yerine neden bu garip API'yi takip etmeniz gerektiğini hiç merak ettiniz mi? Gelelim bunun mantığına.

Bin satırlık bir tablo görünümünüz olduğunu varsayalım. Yeniden kullanılabilir hücreler kullanmadan, her satır için aşağıdaki gibi yeni bir hücre oluşturmamız gerekir:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // Create a new cell whenever cellForRowAt is called. let cell = UITableViewCell() cell.textLabel?.text = "Cell \(indexPath.row)" return cell }

Tahmin edebileceğiniz gibi, bu, aşağı kaydırdıkça cihazın hafızasına bin hücre ekleyecektir. Her hücre bir UIImageView ve çok sayıda metin içeriyorsa ne olacağını hayal edin: Hepsini aynı anda yüklemek, uygulamanın belleğinin dolmasına neden olabilir! Bunun dışında, her bir hücre, kaydırma sırasında tahsis edilecek yeni bellek gerektirecektir. Bir tablo görünümünü hızlı bir şekilde kaydırırsanız, anında çok sayıda küçük bellek parçası tahsis edilir ve bu işlem kullanıcı arayüzünü hantal hale getirir!

Bunu çözmek için Apple bize dequeueReusableCell(withIdentifier:for:) yöntemini sağladı. Hücre yeniden kullanımı, ekranda artık görünmeyen hücreyi bir kuyruğa yerleştirerek çalışır ve ekranda yeni bir hücre görünmek üzereyken (örneğin, kullanıcı aşağı kaydırırken aşağıdaki sonraki hücre), tablo görünümü bu kuyruktan bir hücre alın ve onu cellForRowAt indexPath: yönteminde değiştirin.

Hücre yeniden kullanım kuyruğu mekanizması
iOS'ta hücre yeniden kullanım kuyrukları nasıl çalışır (Geniş önizleme)

Hücreleri depolamak için bir kuyruk kullanıldığında, tablo görünümünün bin hücre oluşturması gerekmez. Bunun yerine, tablo görünümünün alanını kaplayacak kadar hücreye ihtiyacı var.

dequeueReusableCell kullanarak, uygulama tarafından kullanılan belleği azaltabilir ve belleğin bitmesine daha az eğilimli hale getirebiliriz!

Atlamadan sonra daha fazlası! Aşağıdan okumaya devam edin ↓

2. İlk Ekrana Benzer Bir Başlatma Ekranı Kullanma

Apple'ın İnsan Arayüzü Yönergelerinde (HIG) belirtildiği gibi, bir uygulamanın yanıt verme algısını geliştirmek için başlatma ekranları kullanılabilir:

“Yalnızca, uygulamanızın hızlı bir şekilde başlatılıp kullanıma hazır olduğu algısını geliştirmeyi amaçlamaktadır. Her uygulama bir başlatma ekranı sağlamalıdır.”

Markalamayı göstermek veya bir yükleme animasyonu eklemek için açılış ekranı olarak bir başlatma ekranı kullanmak yaygın bir hatadır. Başlatma ekranını, Apple tarafından belirtildiği gibi, uygulamanızın ilk ekranıyla aynı olacak şekilde tasarlayın:

“Uygulamanızın ilk ekranıyla neredeyse aynı olan bir başlatma ekranı tasarlayın. Uygulama başlatmayı bitirdiğinde farklı görünen öğeler eklerseniz, kullanıcılar başlatma ekranı ile uygulamanın ilk ekranı arasında hoş olmayan bir flaş deneyimi yaşayabilir.

“Lansman ekranı bir markalaşma fırsatı değil. Açılış ekranı veya "Hakkında" penceresi gibi görünen bir giriş deneyimi tasarlamayın. Uygulamanızın ilk ekranının statik bir parçası olmadıkça logoları veya diğer marka öğelerini dahil etmeyin."

Yükleme veya markalama amacıyla bir başlatma ekranının kullanılması, ilk kullanım süresini yavaşlatabilir ve kullanıcıya uygulamanın yavaş olduğunu hissettirebilir.

Yeni bir iOS projesine başladığınızda, boş bir LaunchScreen.storyboard oluşturulacaktır. Uygulama, görünüm denetleyicilerini ve düzeni yüklerken bu ekran kullanıcıya gösterilecektir.

Uygulamanızın daha hızlı hissetmesini sağlamak için başlatma ekranını, kullanıcıya gösterilecek olan ilk ekrana (görüntüleme denetleyicisi) benzer olacak şekilde tasarlayabilirsiniz.

Örneğin, Safari uygulamasının başlatma ekranı ilk görünümüne benzer:

Başlatma ekranı ve ilk görünüm benzer görünüyor
Başlatma ekranı ile Safari uygulamasının ilk görünümünün karşılaştırması (Geniş önizleme)

Başlatma ekranı film şeridi, yalnızca UIViewController, UITabBarController ve UINavigationController gibi standart UIKit sınıflarını kullanabilmeniz dışında diğer herhangi bir film şeridi dosyası gibidir. Diğer özel alt sınıfları (UserViewController gibi) kullanmaya çalışırsanız, Xcode size özel sınıf adlarının kullanılmasının yasak olduğunu bildirecektir.

Özel bir sınıf kullanıldığında Xcode hata gösteriyor
Başlatma ekranı film şeridi, UIKit olmayan standart sınıf içeremez. (Büyük önizleme)

Unutulmaması gereken başka bir şey de, UIActivityIndicatorView başlatma ekranına yerleştirildiğinde canlandırılmamasıdır, çünkü iOS başlatma ekranı film şeridinden statik bir görüntü oluşturacak ve bunu kullanıcıya gösterecektir. (Bu, 01:21:56 civarında WWDC 2014 “Platforms State of the Union” sunumunda kısaca bahsedilmiştir.)

Apple'ın HIG'si ayrıca, başlatma ekranı statik olduğundan ve metni farklı dillere hitap edecek şekilde yerelleştiremeyeceğinizden başlatma ekranımıza metin eklemememizi de tavsiye ediyor.

Önerilen okumalar : Yüz Tanıma Özelliğine Sahip Mobil Uygulama: Nasıl Gerçekleştirilir

3. Görünüm Denetleyicileri İçin Durum Geri Yükleme

Durum koruma ve geri yükleme, kullanıcının uygulamadan ayrılmadan hemen önce aynı UI durumuna dönmesine olanak tanır. Bazen, yetersiz bellek nedeniyle, uygulama arka plandayken işletim sisteminin uygulamanızı bellekten kaldırması gerekebilir ve korunmazsa, uygulama son UI durumunun izini kaybedebilir, bu da muhtemelen kullanıcıların işlerini kaybetmelerine neden olabilir. devam etmekte!

Çoklu görev ekranında, arka plana yerleştirilmiş uygulamaların bir listesini görebiliriz. Bu uygulamaların hala arka planda çalıştığını varsayabiliriz; gerçekte, bu uygulamalardan bazıları, bellek talepleri nedeniyle sistem tarafından öldürülebilir ve yeniden başlatılabilir. Çoklu görev görünümünde gördüğümüz uygulama anlık görüntüleri, aslında sistem tarafından uygulamadan çıktığımızda (yani ana sayfaya veya çoklu görev ekranına gitmek için) alınan ekran görüntüleridir.

iOS, en son görünümün ekran görüntüsünü alarak arka planda çalışan uygulamaların yanılsamasını oluşturur
Kullanıcı uygulamadan çıktığında iOS tarafından alınan uygulamaların ekran görüntüleri (Büyük önizleme)

iOS, bu ekran görüntülerini, uygulamanın hala çalıştığı veya bu belirli görünümü gösterdiği yanılsamasını vermek için kullanır, oysa uygulama aynı ekran görüntüsünü görüntülerken arka planda zaten sonlandırılmış veya yeniden başlatılmış olabilir.

Bir uygulamayı çoklu görev ekranından devam ettirdiğinizde, uygulamanın çoklu görev görünümünde gösterilen anlık görüntüden farklı bir kullanıcı arayüzü gösterdiğini hiç yaşadınız mı? Bunun nedeni, uygulamanın durum geri yükleme mekanizmasını uygulamamış olması ve uygulama arka planda kapatıldığında görüntülenen verilerin kaybolmasıdır. Bu, kötü bir deneyime yol açabilir çünkü kullanıcı, uygulamanızın onu bıraktığı zamankiyle aynı durumda olmasını bekler.

Apple'ın makalesinden:

"Uygulamanızın, bıraktıklarıyla aynı durumda olmasını bekliyorlar. Durum koruma ve geri yükleme, uygulamanızın yeniden başlatıldığında önceki durumuna dönmesini sağlar."

UIKit, durum korumayı ve geri yüklemeyi bizim için basitleştirmek için çok çalışır: Bir uygulamanın durumunun kaydedilmesini ve yüklenmesini uygun zamanlarda otomatik olarak gerçekleştirir. Tek yapmamız gereken, uygulamaya durum koruma ve geri yüklemeyi desteklemesini ve uygulamaya hangi verilerin korunması gerektiğini söylemesini sağlamak için bazı yapılandırmalar eklemek.

Durum kaydetmeyi ve geri yüklemeyi etkinleştirmek için şu iki yöntemi AppDelegate.swift :

 func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool { return true }
 func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool { return true }

Bu, uygulamaya uygulamanın durumunu otomatik olarak kaydetmesini ve geri yüklemesini söyleyecektir.

Ardından, uygulamaya hangi görünüm denetleyicilerinin korunması gerektiğini söyleyeceğiz. Bunu, storyboard'da “Restoration ID” belirterek yapıyoruz:

Film şeridinde restorasyon kimliğini ayarlama
Film şeridinde restorasyon kimliğini ayarlama (Büyük önizleme)

Film şeridi kimliğini restorasyon kimliği olarak kullanmak için “Öykü Panosu Kimliğini Kullan” seçeneğini de işaretleyebilirsiniz.

Kodda restorasyon kimliğini ayarlamak için görünüm denetleyicisinin restorationIdentifier özelliğini kullanabiliriz.

 // ViewController.swift self.restorationIdentifier = "MainVC"

Durum koruma sırasında, bir geri yükleme tanımlayıcısı atanan herhangi bir görünüm denetleyicisi veya görünümün durumu diske kaydedilir.

Restorasyon tanımlayıcıları, bir restorasyon yolu oluşturmak için birlikte gruplandırılabilir. Tanımlayıcılar, kök görünüm denetleyicisinden mevcut aktif görünüm denetleyicisine kadar görünüm hiyerarşisi kullanılarak gruplandırılır. Bir MyViewController'ın başka bir sekme çubuğu denetleyicisine gömülü olan bir gezinme denetleyicisine gömülü olduğunu varsayalım. Geri yükleme tanımlayıcıları olarak kendi sınıf adlarını kullandıklarını varsayarsak, geri yükleme yolu şöyle görünecektir:

 TabBarController/NavigationController/MyViewController

Kullanıcı MyViewController etkin görünüm denetleyicisi olarak uygulamadan ayrıldığında, bu yol uygulama tarafından kaydedilir; daha sonra uygulama gösterilen önceki görünüm hiyerarşisini hatırlayacaktır ( Sekme Çubuğu DenetleyicisiGezinti DenetleyicisiGörünüm Denetleyicisi ).

Geri yükleme tanımlayıcısını atadıktan sonra, korunmuş görünüm denetleyicilerinin her biri için encodeRestorableState(with coder:) ve decodeRestorableState(with coder:) yöntemlerini uygulamamız gerekecek. Bu iki yöntem, hangi verilerin kaydedilmesi veya yüklenmesi gerektiğini ve bunların nasıl kodlanacağını veya kodunun çözüleceğini belirlememize izin verir.

Görünüm denetleyicisini görelim:

 // MyViewController.swift​ // MARK: State restoration // UIViewController already conforms to UIStateRestoring protocol by default extension MyViewController { // will be called during state preservation override func encodeRestorableState(with coder: NSCoder) { // encode the data you want to save during state preservation coder.encode(self.username, forKey: "username") super.encodeRestorableState(with: coder) } // will be called during state restoration override func decodeRestorableState(with coder: NSCoder) { // decode the data saved and load it during state restoration if let restoredUsername = coder.decodeObject(forKey: "username") as? String { self.username = restoredUsername } super.decodeRestorableState(with: coder) } }

Kendi yönteminizin altındaki üst sınıf uygulamasını çağırmayı unutmayın. Bu, üst sınıfın durumu kaydetme ve geri yükleme şansına sahip olmasını sağlar.

Nesnelerin kodunu çözmeyi bitirdikten sonra, görünüm denetleyicisine durumun geri yüklendiğini bildirmek için applicationFinishedRestoringState() çağrılır. Bu yöntemde görünüm denetleyicisi için kullanıcı arayüzünü güncelleyebiliriz.

 // MyViewController.swift​ // MARK: State restoration // UIViewController already conforms to UIStateRestoring protocol by default extension MyViewController { ... override func applicationFinishedRestoringState() { // update the UI here self.usernameLabel.text = self.username } }

İşte aldın! Bunlar, uygulamanız için durum koruma ve geri yüklemeyi uygulamaya yönelik temel yöntemlerdir. Durum koruma ve geri yüklemede bir şeyler ters gittiğinde, uygulama kullanıcı tarafından zorla kapatıldığında işletim sisteminin kayıtlı durumu kaldıracağını unutmayın.

Ayrıca, uygun görünse bile, herhangi bir model verisini (yani UserDefaults veya Core Data'ya kaydedilmesi gereken veriler) duruma saklamayın. Kullanıcı gücü uygulamanızdan çıktığında durum verileri kaldırılacaktır ve kesinlikle bu şekilde model verilerini kaybetmek istemezsiniz.

Durum koruma ve geri yüklemenin iyi çalışıp çalışmadığını test etmek için aşağıdaki adımları izleyin:

  1. Xcode kullanarak bir uygulama oluşturun ve başlatın.
  2. Test etmek istediğiniz durum koruma ve geri yükleme ile ekrana gidin.
  3. Uygulamayı arka plana göndermek için (yukarı kaydırarak veya ana sayfa düğmesine çift tıklayarak veya simülatörde Shift ⇧ + Cmd ⌘ + H tuşlarına basarak) ana ekrana dönün.
  4. Düğmeye basarak uygulamayı Xcode'da durdurun.
  5. Uygulamayı yeniden başlatın ve durumun başarıyla geri yüklenip yüklenmediğini kontrol edin.

Bu bölüm yalnızca devlet koruma ve restorasyonunun temellerini kapsadığından, devlet restorasyonu hakkında daha derinlemesine bilgi için Apple Inc.'in aşağıdaki makalelerini tavsiye ederim:

  1. Durumu Koruma ve Geri Yükleme
  2. Kullanıcı Arayüzü Koruma Süreci
  3. Kullanıcı Arayüzü Geri Yükleme Süreci

4. Opak Olmayan Görünümlerin Kullanımını Mümkün Olduğu Kadar Azaltın

Opak görünüm, saydamlığı olmayan bir görünümdür, yani arkasına yerleştirilen herhangi bir UI öğesi hiç görünmez. Interface Builder'da bir görünümü opak olacak şekilde ayarlayabiliriz:

Bu, çizim sistemine bu görünümün arkasında ne varsa çizimi atlamasını bildirecektir.
UIView'u film şeridinde opak olarak ayarlayın (Büyük önizleme)

Veya bunu UIView'ın isOpaque özelliğiyle programlı olarak yapabiliriz:

 view.isOpaque = true

Bir görünümü opak olarak ayarlamak, çizim sisteminin ekranı oluştururken bazı çizim performanslarını optimize etmesini sağlayacaktır.

Bir görünümün şeffaflığı varsa (yani alfa 1.0'ın altındaysa), o zaman iOS'un görünüm hiyerarşisinde farklı görünüm katmanlarını karıştırarak neyin gösterilmesi gerektiğini hesaplamak için fazladan çalışma yapması gerekir. Öte yandan, bir görünüm opak olarak ayarlanırsa, çizim sistemi bu görünümü öne koyar ve arkasındaki çoklu görünüm katmanlarını karıştırmak için fazladan çalışmadan kaçınır.

DebugColor Blended Layers seçeneğini işaretleyerek iOS Simulator'da hangi katmanların harmanlandığını (opak olmayan) kontrol edebilirsiniz.

Yeşil renksiz karışımdır, kırmızı harmanlanmış katmandır
Simülatörde renk karışımlı katmanları göster

Color Blended Layers seçeneğini işaretledikten sonra bazı görünümlerin kırmızı bazılarının ise yeşil olduğunu görebilirsiniz. Kırmızı, görünümün opak olmadığını ve çıktı görüntüsünün arkasında harmanlanmış katmanların bir sonucu olduğunu belirtir. Yeşil, görünümün opak olduğunu ve hiçbir karıştırma yapılmadığını belirtir.

Opak renkli bir arka planla, katmanın başka bir katmanla karıştırılmasına gerek yoktur
Renk karışımı katmanları azaltmak için mümkün olduğunda UILabel'e şeffaf olmayan arka plan rengi atayın. (Büyük önizleme)

Yukarıda gösterilen etiketler (“Arkadaşları Görüntüle” vb.) kırmızıyla vurgulanır, çünkü bir etiket film şeridine sürüklendiğinde, arka plan rengi varsayılan olarak şeffaf olarak ayarlanır. Çizim sistemi ekranı etiket alanının yanında birleştirirken, etiketin arkasındaki katmanı soracak ve bazı hesaplamalar yapacaktır.

Uygulama performansını optimize etmenin bir yolu, kırmızı ile vurgulanan görünüm sayısını olabildiğince azaltmaktır.

label.backgroundColor = UIColor.clear label.backgroundColor = UIColor.white label.backgroundColor = UIColor.clear olarak değiştirerek, etiket ile arkasındaki görünüm katmanı arasındaki katman karışımını azaltabiliriz.

Saydam bir arka plan rengi kullanmak, katmanların karışmasına neden olur
Arka plan rengi şeffaf olduğu için birçok etiket kırmızıyla vurgulanır ve iOS'un arka plan rengini arkasındaki görünümü karıştırarak hesaplamasına neden olur. (Büyük önizleme)

Bir UIImageView'ı opak olarak ayarlamış ve ona bir arka plan rengi atamış olsanız bile, simülatörün resim görünümünde hala kırmızı göstereceğini fark etmiş olabilirsiniz. Bunun nedeni muhtemelen resim görünümü için kullandığınız resmin bir alfa kanalına sahip olmasıdır.

Bir görüntünün alfa kanalını kaldırmak için, görüntünün bir kopyasını oluşturmak için Önizleme uygulamasını kullanabilir ( Shift ⇧ + Cmd ⌘ + S ) ve kaydederken "Alfa" onay kutusunun işaretini kaldırabilirsiniz.

Alfa kanalını atmak için bir görüntüyü kaydederken 'Alfa' onay kutusunun işaretini kaldırın.
Alfa kanalını atmak için bir görüntüyü kaydederken 'Alfa' onay kutusunun işaretini kaldırın. (Büyük önizleme)

5. Ağır İşleme İşlevlerini Arka Plan Konularına Geçin (GCD)

UIKit yalnızca ana iş parçacığında çalıştığından, ana iş parçacığında yoğun işlem yapmak UI'yi yavaşlatır. Ana iş parçacığı UIKit tarafından yalnızca kullanıcı girdisini işlemek ve yanıtlamak için değil, aynı zamanda ekranı çizmek için de kullanılır.

Bir uygulamayı duyarlı hale getirmenin anahtarı, mümkün olduğunca çok sayıda ağır işleme görevini arka plan iş parçacıklarına taşımaktır. Ana iş parçacığında karmaşık hesaplama, ağ oluşturma ve yoğun IO işlemi (örn. diske okuma ve yazma) yapmaktan kaçının.

Bir zamanlar, dokunmatik girişinize aniden yanıt vermeyen bir uygulama kullanmış olabilirsiniz ve uygulama kilitleniyormuş gibi geliyor. Bu, büyük olasılıkla, ana iş parçacığında ağır hesaplama görevleri çalıştıran uygulamadan kaynaklanır.

Ana iş parçacığı genellikle UIKit görevleri (kullanıcı girdisini işleme gibi) ve küçük aralıklarla bazı hafif görevler arasında değişir. Ana iş parçacığında ağır bir görev çalışıyorsa, UIKit'in dokunmatik girişi işlemeden önce ağır görevin bitmesini beklemesi gerekir.

Ana iş parçacığında yoğun performans gerektiren veya zaman alan görevleri yürütmekten kaçının
Ana iş parçacığının UI görevlerini nasıl ele aldığı ve ağır görevler gerçekleştirilirken UI'nin neden askıda kalmasına neden olduğu aşağıda açıklanmıştır. (Büyük önizleme)

Varsayılan olarak, görünüm denetleyicisi yaşam döngüsü yöntemlerinin içindeki kod (viewDidLoad gibi) ve IBOutlet işlevleri ana iş parçacığında yürütülür. Ağır işleme görevlerini bir arka plan iş parçacığına taşımak için Apple tarafından sağlanan Grand Central Dispatch kuyruklarını kullanabiliriz.

İşte sıraları değiştirmek için şablon:

 // Switch to background thread to perform heavy task. DispatchQueue.global(qos: .default).async { // Perform heavy task here. // Switch back to main thread to perform UI-related task. DispatchQueue.main.async { // Update UI. } }

qos , "hizmet kalitesi" anlamına gelir. Farklı hizmet kalitesi değerleri, belirtilen görevler için farklı öncelikleri gösterir. İşletim sistemi, daha yüksek QoS değerlerine sahip kuyruklarda tahsis edilen görevler için daha fazla CPU zamanı ve CPU gücü G/Ç verimini tahsis edecektir; bu, bir görevin daha yüksek QoS değerlerine sahip bir kuyrukta daha hızlı tamamlanacağı anlamına gelir. Daha yüksek bir QoS değeri, daha fazla kaynak kullandığı için daha fazla enerji tüketecektir.

En yüksek öncelikten en düşük önceliğe doğru QoS değerlerinin listesi:

Performans ve enerji verimliliğine göre sıralanmış kuyrukların hizmet kalitesi değerleri
Performansa ve enerji verimliliğine göre sıralanmış kuyruğun hizmet kalitesi değerleri (Geniş önizleme)

Apple, farklı görevler için hangi QoS değerlerinin kullanılacağına dair örnekler içeren kullanışlı bir tablo sağlamıştır.

Akılda tutulması gereken bir şey, tüm UIKit kodunun her zaman ana iş parçacığında yürütülmesi gerektiğidir. Arka plan iş parçacığında UIKit nesnelerinin ( UILabel ve UIImageView gibi) değiştirilmesi, UI'nin gerçekten güncellenmemesi, bir kilitlenme meydana gelmesi vb. gibi istenmeyen bir sonuca neden olabilir.

Apple'ın makalesinden:

"Ana iş parçacığı dışında bir iş parçacığında kullanıcı arabirimini güncellemek, kullanıcı arabirimi güncellemelerinin kaçırılmasına, görsel kusurlara, veri bozulmalarına ve çökmelere neden olabilecek yaygın bir hatadır."

Duyarlı bir uygulamanın nasıl oluşturulacağını daha iyi anlamak için Apple'ın WWDC 2012 videosunu UI eşzamanlılığıyla ilgili izlemenizi öneririm.

notlar

Performans optimizasyonunun dezavantajı, uygulamanın işlevselliğinin üzerine daha fazla kod yazmanız veya ek ayarlar yapılandırmanız gerektiğidir. Bu, uygulamanızın beklenenden daha geç teslim edilmesine neden olabilir ve gelecekte bakımını yapmanız gereken daha fazla kodunuz olur ve daha fazla kod, potansiyel olarak daha fazla hata anlamına gelir.

Uygulamanızı optimize etmek için zaman harcamadan önce, uygulamanın zaten sorunsuz olup olmadığını veya gerçekten optimize edilmesi gereken yanıt vermeyen bir kısmı olup olmadığını kendinize sorun. Zaten sorunsuz olan bir uygulamayı 0,01 saniye kısaltacak şekilde optimize etmek için çok zaman harcamak buna değmeyebilir, çünkü zaman daha iyi özellikler veya diğer öncelikler geliştirmek için daha iyi harcanabilir.

Diğer Kaynaklar

  • “Lezzetli iOS Göz Şekeri Paketi,” Tim Oliver, Tokyo iOS Buluşması 2018 (Video)
  • "iOS'ta Eşzamanlı Kullanıcı Arayüzleri Oluşturma" Andy Matuschak, WWDC 2012 (Video)
  • "Uygulamanızın Kullanıcı Arayüzünü Lansmanlarda Koruma", Apple
  • “Eşzamanlılık Programlama Kılavuzu: Gönderim Kuyrukları,” Documentation Archive, Apple
  • "Ana Konu Denetleyicisi", Apple