Mobile Challenge wallet: competition results and detailed analysis of solutions by the development team

We had two platforms, 1,000,000 rubles in prize money, 6 prizes, 26,000 lines of code to read and evaluate, as well as 20 pages of feedback, several evaluation criteria, a Badweiser box, a pint of pure ether, and 12 bubbles of sedative ... Not that all this was absolutely necessary for holding a developer competition, but if you have already begun to evaluate solutions, then you need to approach the matter seriously.





Summing up the results of the Mobile Challenge Wallet contest and analyzing the participants' decisions in detail.





The task

Try to capture the feeling of a physical wallet in the Wallet app and reimagine two screens: the main screen with a list of cards and a screen with card details.





Suggest a technical implementation of these screens and the transition between them. The display logic, sorting the list of maps, UI / UX, animations and all other nuances are up to you.





1





2 (iOS Android)





1 000 000





100 -  





1  





13





11  





6





iOS 





1 (250 000 ) —  





2 (150 000 ) —  





3 (100 000 ) —





Android





1 (250 000 ) —  





2 (150 000 ) —  





3 (100 000 ) —





, — .





:





  1. .





  2. , .





  3. .





  4. .





:





  1. iOS- Android-, -.





  2. Android: 23+ API.





  3. iOS: iOS 11+.





iOS

, Swift, . 11, . -, , , API. Xcode , SDK .





DI (Dependency Inversion) 

, , .





SR (Single Responsibility)

: , , , . / .





, . iOS- — MyClassName MyClassNameProtocol.





, ( -). , ( ), .





reference value ,

:





class RequestModel: Request {
    var method: HTTPMethod = .get
    var headers: [String : String]? = nil
    var url: URL = URL(string: "https://textures.cardsmobile.ru")!
    var parameters: [String : String]? = nil
    var contentType: ContentTypeRequestEnum = .applicationURLEncoder
}
      
      



struct, class, .





3rd party

, Alamofire . . , Alamofire , AF.request(url).response { … } . URLSession.shared.dataTask(with: url) { … }.resume()? , . , . , — « URLSession ». , .





Core Data

(NSManagedObjectContext) save() . NSManagedObjectContextDidSave background view . , .





Core Data.





DispatchQueue.global

- , , async ( ), - , , .





( ), . Apple .





background Quality Of Service (QoS)

background , ( , , , ). QoS utility. .





— .





, . , — Image Resizing Techniques .





UIViewController

— , . viewWillAppear viewWillDisappear ( , ). , , . , App Store . 





UIApplicationDidEnterBackgroundNotification UIApplicationDidBecomeActiveNotification, , .





UI . , Safe Area.





, . , - , « » , . ( ), Xcode Edit > Format > Spelling and Grammar > Check Spelling While Typing.





, , , UI. Xcode Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. 





, Debugging Tricks and Tips.





(warnings)

(swiftlint, , deprecated ..), ..





: . :)





— , , . .





: self.viewModel.objects().count%5 — , - . 





, « ». «. » .





-, , . , View, Interactor, Model Builder .





— DI (Dependency Injection). 





Dependency Container, .





Kingfisher , ImageLoader. 3rd party .





final ,

- . final . Whole Module Optimization final. , , , final . .





#1 ,









#2 , ,





-

, -, , -, , UI.





Apple Dark Mode, , .





— .





#1





#2





Android-

Kotlin, API 23+ .





. UI. drag&drop.





DI (Dependency Inversion), Singleton

CardsInteractor domain- CardsRepository data-, SOLID. Interface CardsRepository, Domain-.





. : « » github.





, .





Clean Architecture: data, domain, presentation

CardsInteractor Storage . . , CardsInteractor Repository DataSource. CardsViewModelImpl , , , .









-, CharSequence?.isNotNullAndEmpty, List<T>.isEmpty 





, —  .  , , - Kotlin CharSequence?.isNullOrEmpty(), isEmpty() ..





view info1TitleTextView, info2TitleTextView, info3TitleTextView, info4TitleTextView. , view. .





deprecated

window.decorView.systemUiVisibility, View.SYSTEMUIFLAGLAYOUTFULLSCREEN, SYSTEMUIFLAGLAYOUTHIDE_NAVIGATION. deprecated , .





Clean Architecture

, , , , . .





«» .





, :)





#1





#2 «3» ,





#3






: , , , , , , , , , , . 





! . 





- Cardsmobile | Engineering, , iOS Android, QA backend. , .












All Articles