20時間で優れたVKontakteニュヌスフィヌドを䜜成する方法

みなさんこんにちは 最近、VKontakte Mobile Challengeからコンテストがあり、私の䜜品が賞を受賞したした。 第2段階の指瀺では、モバむルデバむス甚のニュヌスフィヌドを開発する必芁があり、䞻な評䟡基準はスムヌズなスクロヌルずポストロヌドでした。 参加したずき、最終結果に関係なく、テヌプの実装ぞのアプロヌチず、コンテスト䞭の感情や感情に぀いおの蚘事を曞くこずにしたした。 私がやった。 ストヌリヌテリングモヌドでニュヌスフィヌドを開発するための猫のヒントずコツ。







コンテストに぀いお



たず第䞀に、競争に぀いお少し話す䟡倀がありたす。 私が知っおいるように、VKontakteは毎幎モバむル開発者向けのむベントを開催しおいたす。 私自身は2012幎ず2013幎にすでに参加しおいたす。 タスクは、それぞれチャットず画像フィルタヌの開発でした。 2013幎に、私はなんずか最終ラりンドに到達し、100,000ルヌブルで勝ちたした。それは、4日間の興味深い仕事で非垞に良い金額に思えたした。



そしお、゜ヌシャルネットワヌクで広告を芋お、詊しおみるこずにしたした。なぜなら、クヌルなこずは、非垞に短時間で高品質のコヌドを蚘述できるこずを自分自身に蚌明するこずだからです。

競争には2぀の段階がありたした最初の段階では、30の質問のテストに合栌し、2぀のオリンピアヌドの問題ず1぀の高品質の問題を解決するこずが提案されたした぀たり、解決策はテキスト圢匏の䞀連の思考です。 1000人以䞊の第2ラりンドでは、112のみが通過しiOSに぀いおのみ話し、Androidでは少し䜎い倀、メむンステヌゞ-アプリケヌション開発が始たりたした。



指瀺では、ニュヌスフィヌドを䜜成し、VK APIずの統合を自分で蚘述する必芁がありたした。フィヌドはすべおのデバむスで非垞にスムヌズである必芁がありたした。コンテンツの出力には特定の芁件がありたした画像ずカルヌセルを含む投皿、いいねのカりンタヌ、共有、ビュヌの数、最小化する機胜特定の条件䞋で投皿を展開したす。



レむアりトがFigmaにアップロヌドされたした。 これは競争にずっお良い遞択です-アクティブなナヌザヌの数のために、競争はすぐに感じられたすそしお、同時接続の50の制限を超えたため、土曜日にノックアりトされたした。



䞀般に、いく぀かの点を陀いお、競争の組織はスムヌズでしたタスクの公開盎埌、レむアりトぞのリンクが壊れおいたこずが刀明し、前述のように、土曜日にFigmaぞの入り口がブロックされたしたこの問題は非垞に迅速に修埩されたした、むベントの埌、かなり時間がかかりたした結果を期埅したす。 しかし、すべおの吊定は同様の投皿をスムヌズにしたす









勝利の蚈画ず戊略



競技䌚に参加したり、詊しおみたい堎合、非垞に重芁で興味深いブロックです。 参加する前に、皆さんがどのような目暙を远求し、どのような結果を達成したいかを考えるこずをお勧めしたす。 コンテストを開始する前に、自分で優勝したい぀たり、賞品を獲埗するこずを決めたした。 これを行うには、戊略が必芁です。









勝利戊略の公匏は次のずおりです普遍的でシンプルなようですが、ほずんどの参加者はそれに埓わないず確信しおいたす。





ミッションは朚曜日から金曜日の倜に開かれたした。 金曜日は就業日であり、職堎で競争に参加する機䌚ず垌望はありたせんでした。 したがっお、金曜日の倜に仕事から戻った埌、私は最初にどれだけの時間を費やすこずができるかを蚈画、評䟡、および蚈算したした。



最初の蚈画は次のずおりです。

日 時間 タスク
金曜日 4時間 承認、プロファむルおよびテヌプのデヌタの取埗。
土曜日 9時間 さたざたな高さの赀い正方圢のディスプレむを備えたテヌプのプロトタむプで、プルツヌリフレッシュで䞊にロヌドし、履歎に無限にロヌドし、すべおのモデルずサヌビスを準備したすAPIの操䜜、キャッシュのキャッシュ、むメヌゞのキャッシュ。

日曜日 9時間 実際のデヌタテキスト、単䞀の画像、カルヌセル、いいねのカりンタヌ、ビュヌ、レむアりトによる最終調敎の出力。


テヌプ実装技術



やった 玳士、開発者、あなたは正しいブロックを芋぀けたした。 ここでは、タスクの䞻芁郚分であるニュヌスフィヌドの実装に぀いお説明したす。



䞀般的に、ニュヌスフィヌドを解陀する堎合、ニュヌスフィヌドは単に適甚された実装です。䞀般に、異皮゚ンティティのリストの䜜成に぀いお説明したす぀たり、それぞれが独自の衚瀺を持぀こずができ、远加の蚈算ず独自の高さが必芁です。 、さらにリストはプルトゥリフレッシュを介しお曎新でき、䞋から無限にデヌタをロヌドできたす。



そもそも解決しようず決めたのは䞀般的な問題でした。 最初のステップは、既存の゜リュヌションを分析するこずです。 あなたは最匷のものに集䞭する必芁があるので、比范のために3぀のアプリケヌションを遞択したしたVkontakte、Facebook、Instagram。



それで、私は6぀の最も深刻で重倧な問題の研究を行いたかったのです。



  1. プルトゥリフレッシュリストの䞀番䞊に远加
  2. スムヌズな履歎の読み蟌みリストの最埌に远加
  3. 高速スクロヌルたたは指で摩擊力が蚱す限りテヌプを加速したす
  4. 䞀番䞊たでスクロヌルしたす倧きなストヌリヌを蓄積し、ステヌタスバヌをクリックしたす
  5. 投皿の動的な開瀺増加ずアニメヌションはありたすか
  6. ほが完党なパケット損倱モヌドでのテヌプの動䜜開発者->ネットワヌクリンクコンディショナヌ->非垞に悪いネットワヌク




䞀般に、すべおのアプリケヌションは正垞に動䜜したすが、ただいく぀かの問題に気付きたした。

たずえば、曎新䞭に指を離さずにリボンをゆっくりず匕き䞊げるず、VKontakteのプルトゥリフレッシュの動䜜を確認できたす巊のgifを参照。



この飛躍も芋られたすか



InstagramずFacebookはそのような振る舞いを芋せたせんでした。



そしお、投皿の開瀺には顕著な違いがありたす。 FacebookずInstagramの堎合、これはスムヌズなアニメヌションで行われ、VKontakteはクリックするだけでサむズを曎新したす。







したがっお、私たちのタスクは、スムヌズなスクロヌルを䜜成し、投皿をダりンロヌドし、アニメヌションで公開するこずです。



最初のステップは、抂念を遞択し、赀の正方圢にプロトタむプを䜜成するこずですなぜプロトタむプにい぀も盎感的に赀い色を遞択するのか疑問に思いたす。これは誰の堎合ですか。

生産性を向䞊させる私の䞻なアむデアは、Appleが長幎導入しおきたすべおの機胜を攟棄し、文字通りiOS 3の開発にロヌルバックするこずでした。





その結果、次のコンセプトが遞択されたした。











もう少し詳しく芋おみたしょう。



メむンスレッドでは、むンタヌフェむスを曎新し、ナヌザヌアクションスクロヌルダりンずプルツヌリフレッシュ、投皿をクリックしお増加を凊理し、デヌタを受信および準備するためのサヌビスモデルをトリガヌしたす。



API呌び出し 。 ここではすべおが簡単です-NSURLCacheが蚭定されたNSURLSession。 履歎をロヌドするずきはキャッシュを䜿甚し、プルツヌリフレッシュするずきはキャッシュを無効にするこずが重芁です。 たさにこの動䜜は、VKずFacebookで芋匵っおいたした。



モデルの解析ず䜜成 。 特定のリク゚ストを凊理し、゚ラヌをスロヌし、デヌタを含むトランスポヌトモデルを返すためのロゞックを次に瀺したす。



プレれンテヌションモデルの蚈算 。 パフォヌマンスを最適化するための最も重芁なステップ。 ここで、トランスポヌトモデルはPostModelポストフィックスを䜿甚しお゚ンティティに倉換されたす。 ViewModelは、衚瀺甚に完党に準備されたデヌタを保存したす-AttributedString、蚈算されたセルの高さ折りたたみず展開の2぀の状態、文字列ずしおのフルネヌム、日付文字列DateFormatterから既に倉換枈み。



その埌のみ、デヌタはメむンストリヌムに戻りたす。 このようなロゞックをSwiftに実装するのは非垞に䟿利で簡単です。 ViewModel構造を䜜成したす。 構造は、新しいスレッドに転送されるずきにコピヌされたす。



優れたコンセプトが甚意できたので、出力メカニズム自䜓に぀いお説明したしょう。



最初に、テヌプの実装察象UITableViewたたはUICollectionViewを遞択する必芁がありたした実装に十分な時間が割り圓おられおいたせん。 明らかに、UITableViewは出力の䞀芧衚瀺に適しおいたすが、リストを䞊、䞋から拡倧したり、コンテンツセルを増やしたりするこずに問題があるかどうかは非垞に心配でした。 したがっお、私は単玔なものから耇雑なものに行くこずにしたした-぀たり UITableViewに問題がなければ、そのたたにしたす。



私が最初に決めたのは、プルトゥリフレッシュを決めるこずでした。 このパタヌンを実装するために、UIRefreshControlがありたす。 箄5〜6幎前、UIActivityIndi​​catorを䜿甚しお実装を蚘述し、テヌブルのcontentInsetを倉曎したした。 だから、今はしないでください UIRefreshControlには䟿利なコンパクトなむンタヌフェむスがあり、束葉杖の雲が必芁です。 䜿い方はずおも簡単です。







ただし、それを䜿甚するず、VKクラむアントの䞊蚘の問題がどこから発生するかが明らかになりたす。 それらはコンポヌネント自䜓に存圚するようです。 私はすぐにその理由ず解決策を探したした。



むンタヌネットのヒントは蚀う そのようなたたはそのような 





私はこれずそれの䞡方を詊したした-私は肯定的な効果がありたせんでした。 私は動揺しおいたしたが、時間を無駄にせずに進むこずにしたした。 ずころで、誰かがこの問題を克服する方法を知っおいるなら-コメントに曞いおください。



次のステップは、䞋からデヌタのロヌドを実装するこずです。



最初はあたりクヌルになりたせんでした-䞋から読み蟌むずひどい遅れがありたした明らかにテヌブルからcontentSizeをゞャンプしたした









そしおこれは地獄だ:-)この結果では、あなたは間違いなく勝おない。 しかし、簡単な怜玢で、私が忘れおいた玠晎らしい手がかりが埗られたした。







そしお出来䞊がり









セルの高さをアニメヌション化する方法を決定するこずは残っおいたす。



頭に浮かんだ最初のアむデアは、visibleCellsに沿っお実行し、アニメヌションブロックの高さを増やすこずでした。 しかし、分析の段階でさえ、この考えは捚おるべきです-問題は、UITableViewDataSourceで指定された高さを同期し、contentSizeで䜕かをする必芁があるこずですこれはAppleによっお匷く掚奚されおいたす。



思い぀いた2番目の考えは正しいこずが刀明したした-UITableViewには、アニメヌションブロックで実行できるinsert / reload / deleteメ゜ッドがありたす







heightForRowAtに新しい高さも远加する必芁があるこずを忘れないでください。







すべおのように芋えたすが、完党ではありたせん ポストの展開のアニメヌションには、埮劙な点が1぀ありたした。 IntagramたたはFacebookでテキストを探しおください。高さが増すずすぐにスムヌズに衚瀺されたす。 どうする 行ごずにレンダリングしたすか NSTextContainerのレベルに達するず、おそらく同様の機䌚が衚瀺されたす。 しかし、䞀床にすべおのテキストを衚瀺するこずはそのような堎合にはそれほど悪い考えではないように思えたした。 clipToBoundsをsuperViewに蚭定するず、UILabelが配眮され、テキストが衚瀺されたす。 そしお、アプロヌチはうたくいきたした ああ、このアニメヌションは私に倚くのむンスピレヌションを䞎え、第二の颚が開きたした。 結局のずころ、ネむティブVKクラむアントにはそのようなアニメヌションはありたせん。 だから圌女は勝぀チャンスを远加する必芁がありたす:-)



テヌプの実装の残りの詳现はそれほど興味深いものではありたせん。 しかし、あなたはコメントでそれらを尋ねるこずができたす。 たた、コヌドのレむアりトに問題はありたせん。 ここでは-github.com/katleta3000/vkmobilechallengeです。 私はコヌマをしおおらず、いく぀かの堎所にマゞックナンバヌがありたすしかし、これはスピヌドコンテストなので、䜕かを犠牲にしなければなりたせんでした。 ずころで、そこでコミットにゞャンプするこずができたす名前は明確です。



結果はここで芋るこずができたす-www.youtube.com/watch?v=Md8YiJxSW1M&feature=youtu.be もちろん品質はひどく倱われたすが、正確に滑らかなスクロヌルを瀺すにはgifよりも良いです





統蚈、結果、結論



コンテストは垞にタむマヌで行われたした。 20時間半の玔粋なコヌディング時間が発生したした。 远跡時間は2぀の点で圹立ちたした。芚えおいるように、抜象的な単䜍での掚定倀があったため、最終日の半ばたでには既に良奜な远跡統蚈があり、残りの最終タスクをより正確に蚈画するこずができたした。 そしお、第二に、「䞀回の集䞭」のパタヌンを特定し、蚌明するこずができたした。 各ディメンションは新しい反埩であるため、コヌドの蚘述を68回繰り返しおいるこずがわかりたした。 平均するず、18.5分になりたす。 しかし、実際には、反埩の最初の日には平均25分があり、2日目の終わりにはそれぞれ7分でした:-)あなたは倢䞭になり、非垞に緊匵し、疲れ、パフォヌマンスが䜎䞋したす。 そのようなデヌタは次回に圹立ちたす。



個人的には、 Hourlyプログラムを䜿甚したしたダりンロヌドしお詊しおみおください-それは必芁なタスクを解決するだけですそしお、私も自分で開発しおいたす



玠敵なボヌナス-閉じたパズルごずに、次のような非垞に玠晎らしい励たし画面が衚瀺されたす。









「VK Mobile Challenge」タスクの最埌に、次の画面が衚瀺されたこずは面癜いです。









そしおはい そしおそれが起こった:-)結果に進みたす。



ぬいぐるみのためにピヌチを匕っ匵らないようにしたしょう。 知らなかったピヌチは猫の名前-VKの䞻人公です。 非垞にクヌルなギフト商品









4䜍になり、175kルヌブルを獲埗したした。 はい、おそらくあなたはすでにHabra-katで写真を焌きたした。 そしお、はい、私は確かに満足しおいたす。 私は目暙に到達したした:-)そしお、これは間違いなく非垞に楜しいです。



最埌に、 vkontakteに感謝したす-結局、競争はクヌルでよく組織されおいたした。 そしお、すべおの読者にチャレンゞずハッカ゜ンに参加するこずをお勧めしたす-これは、自分自身に挑戊し、䞖界䞭のトップ開発者たたは少なくずもロシア語を話すコミュニティず競争するための玠晎らしい方法です。



All Articles