Masif Görüş Kontrol Cihazı - IOS - Çözümler


16

Eminim her yeni iOS geliştiricisi aşağıdaki soruna sahiptir: Görünüm Kontrolörleri çeşitli amaçlar için kodlarla çok hızlı bir şekilde kalabalıklaşır, 500 + kod satırına kolayca ulaşır.

İki temel ve ortak ekran için şu şekilde görünür:

1) Form Ekranı: resim açıklamasını buraya girin

2) Tablo Görünümü Denetleyici Ekranı resim açıklamasını buraya girin

Şimdiye kadar iki farklı çözüm okudum:

  1. İlk Çözüm: https://bendyworks.com/single-responsibility-principle-ios/ . Bu, Bildirimlere dayanır, Görünüm Denetleyicisini (Niyetler) Görünüm Modelinden tamamen ayırır ve böylece Görünüm Denetleyicisindeki kodu azaltır. Ben Go-To yapıları gibi, kod kırma dezavantajı olduğunu düşünüyorum. Şöyle görünüyor: resim açıklamasını buraya girin

  2. İkinci çözüm aynı kalabalık Görünüm Denetleyicilerini tutar (düğme eylemleri VC içinde yürütülür ve bu şekilde devam eder). ancak çoğu kategoriye göre TPKeyboardAvoiding , BlocksKit veya diğer çözümleri kullanır . Bu ikinci çözümle, kod önemli ölçüde azalır, ancak görünüm denetleyicisinin hala çok fazla sorumluluğu vardır.

Bu çözümler hakkında ne düşünüyorsunuz? Hangisi daha iyi? Daha iyisi var mı?


5
Zaman nedeniyle iyi bir cevap veremem, ama bu sizi doğru yöne yönlendirmelidir.
Mike D

Niyetim, bu kadar çok yeni geliştiricinin sahip olduğu bu sorunun üstesinden gelmek için mümkün olduğunca çok iyi cevap toplamaktır. Bağlantı için teşekkürler, yeni bir şey bulursam kesinlikle buraya göndereceğim.
Ravul

İşte Andy Matuschak tarafından yağ görünüm denetleyicileri ile mücadele konusunda büyük bir tartışma var https://realm.io/news/andy-matuschak-refactor-mega-controller/
Tomasz Bak

Yanıtlar:


6

Bu sorunu çözmek için MVVM'yi kullanabiliriz.

Model-View-ViewModel veya yaygın olarak bilindiği gibi MVVM deseni bir UI tasarım modelidir. VM, VC'den UI için model verileri hazırlama hakkındaki tüm mantığı alır.

Örnek:
Bazı alanlara sahip model nesneniz var, bazılarını biçimlendirmek, hesaplama yapmak ve birleştirmek istiyorsunuz.

MVC durumda ViewController bulunan tüm bu mantık.
MVVM'de hepsini VC'den VM'ye taşırsınız.

VM, UI ve VC için tüm verileri hazırlar ve bu şekilde ayarlar.

(VC sınıfında)

self.descriptionLabel = self.viewModel.textForDescriptionLabel;

Öğreticiler ve konular:


3
Bu teorik olarak soruyu cevaplayabilse de, cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir.
Bart van Ingen Schenau

Bart'a katılıyorum. Başka hiç kimse tüm bu yöntemlerin bir özetini göndermeyecekse, hepsini anladığım ve test ettiğimde bir tane yapacağım.
Ravul

2
@Ravul güncellendi cevap
kaspartus

Cevabınızı oyladım ve bu fikir için teşekkür ederim. Sadece Fonksiyonel Reaktif Programlama hakkında okuyorum ve iyi bir fikir gibi görünüyor. Bu sorunun cevabının, birkaç yaklaşımı, dezavantajı ve soruna yaklaşmanın aşağıdaki 4 yolu için en az bir kavramsal diyagramı olan bir numaralandırma olduğunu düşünüyorum: 1) Reaktif Kakao 2) KVO 3) Delege yöntemi ve 4) Klasik yol bir View Controller yazma. Benden önce kimse yapmazsa, tüm bu yöntemleri test eder etmez yazacağım. Bu arada yeni yollar bulursam, bu daha da iyidir.
Ravul

3

Daha önce büyük boyutlu Görünüm Denetleyicilerindeki kodu çözmek zorunda kaldım ve gerçekten ilk başta içerikte gezinme yeteneğimi engelledi. Fark ettiğim önemli bir nokta, View Controller'ın tek başına boyutunun işleri parçalamak için yeterli bir neden olmadığı. 1 büyük dosyaya sahip olma karmaşıklığı ve bir sürü küçük dosyaya sahip olma karmaşıklığı vardır. Bir Denetleyiciyi daha küçük parçalara bölmek için yeniden düzenleme yapmanın bazı geçerli nedenleri şunlardır:

MVC

View Controller, View ve Model arasındaki bağlantı tutkalı olmaktan daha fazlasını yapmamalıdır. Çok fazla ağ bağlantı kodu, görüntü işleme kodu vb. Varsa, bunları yardımcı sınıflara bölmeyi düşünün.

Veri kaynağı olarak View Controller ile Çoklu Kontroller

Ekranda Görünüm Denetleyicinizi veri kaynağı olarak kullanan bir sürü denetiminiz varsa, bunları ayrı veri kaynağı nesnelerine bölmeyi ve veri kaynağı olmasını sağlayın. Ya da bunları ayrı Görünüm Denetleyicilerine bölebilirsiniz (Görünüm Denetleyicisinin diğer denetleyiciye ek olarak bir tablo görünümü varsa, bunu kendi Tablo Görünümü Denetleyici sınıfına ayırabilirsiniz).

Yinelenen Kod

Farklı Görünüm Denetleyicilerinde tam olarak aynı koda sahipseniz, bunu 1 paylaşılan konuma yerleştirin. Bu, kodunuzu yeniden kullanılabilir hale getirecek ve karmaşıklığı yönetmeye yardımcı olacaktır.

Görünüm Denetleyicisi karmaşıklığını en aza indirmek için bazı ek öneriler:

Programlı yerine film şeridi

Görünüm öğeleri oluşturmak çok kod ve çerçeve geometrisi kodu da çok iş. Önceden otomatik düzen kısıtlamaları kullanmayı ve Görünüm öğelerinin çoğunu film şeridine mümkün olduğunca koymayı düşünün.

Gereksiz kod / yorumlar

Ayrıca gereksiz kodu / yorumları kaldırdığınızdan emin olun. Çoğu zaman yeni bir View Controller dosyası kullanmadığınız yöntemlerle birlikte gelir. Böyle bir yöntem kullanmıyorsanız, didReceiveMemoryWarningo zaman bu yöntemi kullanmak güvenlidir. Ayrıca, View Controller dosyası çok büyük olduğu için bazen eski kodu veya yorumları kaldırmak korkutucu olabilir. Bunu ertelemeyin! Sadece karmaşıklığı arttırır.

Bildirimler

Bildirimlerle ilgili sorunuzu yanıtlamak için: Bildirimler, her şeyle kullanılacak bir Altın Çekiç değildir. Birden fazla Görünüm Denetleyicisinin 1 belirli işlem nedeniyle aynı anda güncellenmesi gerektiğinde bildirimleri yararlı buluyorum. Ancak bildirimlere dikkat edin, onları aşırı kullanmak, onları izlemeye çalışırken çok fazla acıya neden olabilir.


2

VIPER olarak adlandırdıkları özel bir mimari var (Görünüm, Etkileşim, Sunum Yapan Kişi, Varlık ve Yönlendirme). Bilmeniz gerekenler burada özgeçmişinizi deneyeceğim:

Görünüm

  • kukla görüşlerdir;
  • UIView, UIViewController, UILabel, vb. nesneleri içerir;
  • içerik bekler Sunum ;
  • kullanıcı etkileşimini yönetme ve Presenter katmanına aktarma .

sunucu

  • UI nesnelerini bilmiyor;
  • Görünüm katmanından girdi alma ;
  • görünüm mantığını işlemek (ekleme yöntemi diğer ekranı gösterecektir);

Yönlendirme

  • gezinme mantığını ve geçiş animasyonlarını yönetme;
  • UINavigationController, UIWindow, vb. nesneleri bilir;

Yani, kodunuzda temizleyeceğinizi düşündüğüm:

  • veri doğrulamaları Presenter katmanına taşınır ;

  • gezinme Tel Kafes nesnelerine ( Yönlendirme katmanı) geçecektir ;

  • bakış kontrol cihazınızı KURU prensibine göre ayırın ;

  • Karmaşık ekranlarda iki veya daha fazla Görünüm ve Sunum Yapılır.

VIPER mimarisi ile ilgili aşağıdaki bağlantıyı görmelisiniz http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/

İyi şanslar!


1
Bu mimari küçük uygulamalar için çalışıyor mu? Görünüşe göre projeye tanıtmak için çok sayıda nesne oluşturmanız gerekiyor.
Tomasz Bąk

Evet, geleneksel MVC'den daha fazla nesne olduğuna katılıyorum ama buna değer. Bu yıl oluşturduğum basit bir örneği görebilirsiniz github.com/orafaelreis/cascavel Cascavel, VIPER projelerini başlatmak için temel bir proje gibidir.
orafaelreis

Mükemmel! VIPER mimarisi, büyük görünüm denetleyicileri sorununu önlemek için tam olarak tasarlanmış gibi görünüyor.
Christophe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.