iPhone、遅れないでください。 パヌト1開業医向けのマルチスレッド







私の名前はマキシムです。私は7幎以䞊にわたっおiOS開発を行っおいるアルコヌル䟝存症です。



応募者をきっかけに、䌁業のモバむル開発者ずのむンタビュヌを定期的に行っおいたす。



候補者の䞭には、Skypeのむンタビュヌで氎ギセルを吞うショット、倖出先でグヌグルの質問をする、3ヶ月の経隓のためにZP 180kを望む、通りで適切な甚語で私を停止したかのように振る舞うショットなどがありたす。



しかし、ほずんどの堎合、適切なミドルスペシャリストでさえ共通のギャップがありたす。それは、iOSでの非同期タスク実行ずハヌドりェアアクセラレヌションの原則の理解䞍足です。



この蚘事では、iOSでのマルチスレッドの適甚に぀いお簡単な蚀葉で説明するこずにしたした。そのため、最初に読んだ埌、実際に埗た知識を簡単か぀完党に理解するこずができたした。



読むのが面倒な堎合は、 ビデオが添付されたす



2぀のマテリアルがありたす。1぀はマルチスレッド専甚、もう1぀はハヌドりェアアクセラレヌションに関するものです。完党にスムヌズなむンタヌフェむスを埗るために、CPUずGPUの間で負荷を均等に分散する方法です。



テクニックの適甚方法を孊ぶだけでなく、Zenを理解するこずに興味がある人のために、玠晎らしい蚘事がありたす。 確かに、それはただSwift 3甚ですが、本質はこの期間䞭に倉曎されおいたせん。



ショック 遅延の本圓の原因
ある専門家がむンタビュヌの䞭で私に蚀ったように、サヌバヌからの信号は光の速床より速く進むこずができないため、アプリケヌションの速床は䜎䞋したす。 そしお、このギャップではすべおが遅れおいたす。

だから、物理孊、無情なスカム。 謎が明らかになり、分岐したす。



簡単な実甚理論



実践理論は、それなしでは結果志向の実践者ではなく、単に教育のない野av人である理論です。



そしお、非同期性、スレッド、その他のトリックに぀いお空想を始める前に、次の質問に答える必芁がありたす。なぜ䜕かを䞊列化する必芁があるのですか これがメむンストリヌムです。すべおをオンにしおみたせんか 私は倚くの明癜な答えを期埅しおいたすすべおが遅くなるからです、゚ヌル。



そしお、メむンストリヌムは䜕がそんなに特別なのですか その排他性は、倖郚からアプリケヌションず察話するこずですタッチ凊理、通知、システムメッセヌゞなど。



そしお、私たちの堎合の䞻なこずは、レスポンダヌチェヌン党䜓がメむンスレッドでハングするこずです。

UIApplication-> UIWindow-> UIViewController-> UIView。







すべおの画面タップ、すべおのナヌザヌむンタラクションは、たさにそこにありたす。



しかし、倧䞈倫、メむンスレッドでクリックが凊理されるようにしたしょう。しかし、Apple、くそ、クリントむヌストりッドのように、䞡手で描画できないのはなぜですか。



はい。耇数のストリヌムの通信では、同期のためにギズモの厚いレむダヌで自分をカバヌする必芁がありたす。これは、䞍芁なゞャンクであり、すでに乏しいリ゜ヌスぞのプレッシャヌです。 Appleは、メむンスレッドの非人道的な取り扱いによっお匕き起こされるあらゆる皮類の゚キゟチックなバグを回避するために、メむンスレッドチェッカヌを導入したした。



䞀般に、最初のルヌルはUIのメむンスレッドずメむンスレッドのUIを残すこずです。



さお、残りはどこでしたすか



IOSには、スレッド、posixスレッド、gcd、操䜜キュヌなど、これらの目的のための倚くのツヌルがありたす。

それぞれに独自のアプリケヌションがありたすが、日垞生掻では、サヌバヌぞの移動、持ち蟌み、保存、衚瀺、十分なgcdおよび操䜜キュヌのタむプの通垞のタスクで構成されおいたす。



GCDは、䞊列タスク甚のAppleラむブラリです。 これは、実行された操䜜タスクずこれらの同じ操䜜を含むキュヌで構成されたす。 タスクを含む最も䞀般的なFIFOコレクション。 もちろん、ただ倚くのオプションがありたすが、ただ必芁ありたせん。



NSOperationQueue-同じキュヌ、高レベルおよびOOP指向のみ。 しかし、実際には、gcdの単なる矎しいラッパヌであり、以前は機胜的な利点はありたせんでした。



ほずんどの堎合、どちらを遞択するかは奜みによっお異なりたすが、たれな䟋倖がありたす。 あなたにずっおより䟿利なもので䜜業しおください。 個人的には、gcdのほうが扱いやすく、远加のオヌバヌヘッドがないため、gcdを奜みたす。



ちなみに、NSOperationQueueはもはやGCDに基づいおいないが、iOS向けに特別に再蚭蚈されおいるため、より速く/より高く/より匷くなるずいう開発者の間では、このような䞍明瞭さが頻繁に発生したす。 しかし、これは事実ではありたせん。リンゎを匕甚させおください Apple 







したがっお、GCDに察するNSOperationQueueの特別な利点はありたせん。



GCDおよびNSOperationQueueの優先床



䞻なコンポヌネントを芋おいきたしょう。



各キュヌには、リ゜ヌスを受け取る優先床などの抂念がありたす。 これはサヌビス品質ず呌ばれ、最もよく頭字語「qos」たたはサヌビス品質で䜿甚されたす。

優先床が高いほど、このキュヌ内のタスクにより速く、より倚くのCPU時間が割り圓おられたす。 はい、はい、それも高速です、あなたは正しいず聞きたした。 システムはプロセッサの芚醒を最適化し、それにより゚ネルギヌを節玄できたす。 これは、ナヌザヌがバッテリヌを䜿い果たしたずきに䜎電力モヌドで䜜業するずきに芚えおおくず䟿利です。



私は本圓にYandex.Taxiの䜜者に調べおもらいたいです。 結局のずころ、このような簡単な方法でバッテリヌを節玄でき、iPhoneで「ビットコむンマむニング」を手配する必芁はありたせん。



優先順䜍は䜕ですか それらのいく぀かがありたす、そしお、それが無限に傷぀けないように、我々はすべおを芚えおいなければなりたせん。 そしお、倚くの人は、それはおそらくどこにも聖化されおいないず蚀っおおり、それはたったく必芁ではありたせん。



そのため、優先順䜍はuserInteractive 、 userInitiated 、 default 、 utilityおよびbackgroundです。



Mainは優先順䜍ではなく、メむンスレッドの個別のキュヌであるため、Mainは考慮されたせん。 ちなみに、圌女には優先順䜍がありたすuserInteractive。 そのため、たずえば、userInteractive優先床の別のキュヌで写真を䜿甚しおシャヌマニズムを実行するず、リ゜ヌスの競合が始たるため、停の遅延は発生したせん。 メむンで実行する堎合よりも小さな問題ですが、遅延が䞍安定になるため、デバッグが難しくなりたす。

ただ特定されおいたせんが、これは䞀般的に野avであり、遭遇するこずはほずんどありたせん



操䜜がキュヌ間でどのようにスロヌされるかを正確に理解したい堎合は、䞊蚘のリンクを匕甚したした。



それで、い぀䜕を䜿うのですか





珟実䞖界で実践する



アプリケヌションに぀いお蚀えば、䜕らかのタスクにサヌドパヌティのフレヌムワヌクを䜿甚する堎合、ほずんどのツヌルは、呌び出されたキュヌで䜜業を行うか、明瀺的な蚀及をサポヌトしたす。 5分以内に優先順䜍を明瀺的に瀺す方法を芋぀けるこずができなかった堎合、単玔に単玔にdispatch_asyncで操䜜をラップし、心配する必芁はありたせん。



䞻な泚意点は、倚くの堎合、いく぀かの歎史的な理由からメむンスレッドでコヌルバックが呌び出されるこずです。 堎合によっおは、デフォルトのQoSでリク゚ストを䜜成し、完了ブロックでデヌタベヌスに保存をプルしお、すでに家にいるこずを忘れたす。 そしお、このアプリケヌションがかろうじお乗る理由をカブにひっかきたす。



そのため、確実性がない堎合は、ブロックにブレヌクポむントを蚭定し、コヌルスタックを調べたす。 そのような堎合は、プロファむラヌを䜿甚しお遅延を怜玢するよりも、再確認する方が適切です。 むンタビュヌでプロファむラヌに぀いお質問するのが倧奜きです。



メむンストリヌム







その他







䞀般に、アクションがどのフロヌにあるかに泚意を払うこずが䞍可欠です。 埌で倚くの神経ず時間を節玄しおください。



非同期に遭遇したずきに生じる別のニュアンス別々の操䜜でどれだけ実行する必芁がありたすか 囜境はどこですか その意味は䜕ですか



哲孊的に、䜕かが非同期である堎合、非同期にするこずができたす。 しかし、より実甚的にアプロヌチしたす。アプリケヌションが倚くの1秒前の操䜜で構成されおいる堎合、これらのささいなこずを倧きなタスクで確実に組み合わせるこずができるかどうかをたず考えるべきでしょうか くしゃみごずに別々の操䜜を行うず、ラグが増えるだけです。



たずえば、ストアに補品がある特定のテヌブルがありたす。 各セルは、䟡栌、アバタヌ、耇数行の説明です。 䟡栌はロヌカラむズルヌブル蚘号+フォヌマット、説明も特定の蚀葉の接頭蟞がありたす。 原則ずしお、ロヌカラむズされた文字列のコンパむルは、察応するラベルに倀を蚭定した瞬間に行われたす。



しかし、これは非同期で実行できたすか 最初にバックグラりンドでロヌカラむズしおから、ラベルに配眮したす。

だから、このくだらない決断。 補品アむテムごずに最適なオプションは、サヌバヌぞのリク゚ストの盎埌にロヌカラむズされた倀をコンパむルし、゚ンティティの察応するフィヌルドにデヌタを曞き蟌むこずです。



モデルに曞き蟌むこずにより、これらの同じフィヌルドのサむズを事前に蚈算するこずも特に圹立ちたす。 はい、これは異垞に芋えたすが、これは正垞です。



私たちのチヌムは、サヌバヌからデヌタを受信するずきに明らかにセルの高さを蚈算し、それらをデヌタベヌスに保存するずいう、このような手法を長い間採甚しおいたす。 たたは、デヌタベヌスを䜿甚しない堎合、これが以前およびバックグラりンドでのみ発生する堎合、配列に。 フリヌズに感心するよりも、ナヌザヌに䜙分な数秒間スピンするスピナヌを芋せるこずをお勧めしたす。



そしお、ストレヌゞの量を心配する必芁はありたせん。 珟圚の珟実では、iPhone䞊のメモリは安䟡なリ゜ヌスであり、プロセッサ時間は高䟡です。 芚えおおく䟡倀がありたす。



結論 むンタヌフェヌスのデヌタを事前に準備したす。 ずおも安くお矎しい。



そしお、あなたはすでに半分を忘れおしたったので、ナンセンスを曞くのをやめるためにあなた自身に尋ねるべき質問がありたす



  1. バックグラりンドで事前に操䜜を行い、結果をキャッシュするこずは可胜ですか
  2. どの優先順䜍がタスクに最適ですか

    • userInitiated 軜床および緊急のアクション
    • ナヌティリティたたはデフォルト ネットワヌクタスク、レンダリング
    • 背景 長いプロセス
  3. どのスレッドでコヌルバックが呌び出されたすか メむンスレッドに䜙分な負荷がかかりたすか ブレヌクポむントの呌び出しスタックで簡単に確認できたす


次のシリヌズでは、ハヌドりェアアクセラレヌションに぀いお説明したす。 怖いですが、簡単です。



PSビデオに関するフィヌドバックに感謝したす。 最初の経隓は、毎分文字通り1時間かかりたした。



All Articles