2016-08-10 10 views
15

Xcode 8ベータ5では、DispatchQueueのイニシャライザが変更され、qos(サービス品質)、属性、および自動解放の頻度に別々の引数が使用できるようになりました。新しいイニシャライザで動作するようにコードを変換するのに問題はありませんでしたが、いくつかの属性、特にオートリリースの頻度の意味は不明です。例えばSwift 3のDispatchQueueでのAutoreleaseFrequency 5

は、Xcodeの8ベータ3及びスイフト3において、IのようなシリアルDispatchQueueを作成することができた:Xcodeの8ベータ5及びスウィフト3において

let serialQueue = DispatchQueue(label: "Concurrent Map", attributes: [.serial, .qosBackground], target: nil) 

let serialQueue = DispatchQueue(label: "Concurrent Map", qos: .background, attributes: [], autoreleaseFrequency: .inherit, target: nil) 

私の質問は次のとおりです:

  • 新しいDispatchQueue.Attributesでは、.serialはもはやメンバーです。これは、.concurrentがないとシリアルキューが作成されることを意味しますか?私がSwift Playgroundsで行った最初のテストでは、これを確認しているようです。他の誰も確認できますか?
  • DispatchQueue.AutoreleaseFrequencyは、.inherit、.never、および.workItemの新しい型です。これらはどういう意味ですか?私はGCDとオートリリースに関するいくつかの研究をしましたが、私はオートリアーゼプールのコンセプトに慣れていません。

答えて

9

これらの新しい属性についての公式な文書は見つかりませんでしたが、既存のGCDのドキュメントを参照して、行間を読むと、ここで意図されていることを簡単に説明することができます。

新しいDispatchQueue.Attributesでは、.serialはもはやメンバではありません。 これは、.concurrentがないとシリアルキューが作成されることを意味しますか? 私がSwift Playgroundで行った最初のテストでは、これを確認しているようです。 誰でも確認できますか?

はい。キューは、シリアルまたは並行のいずれかです。作成するほとんどのキューはシリアルなので、デフォルトの動作を望まない場合は、それらを並行に設定する必要があります。

私はDispatchQueue.AutoreleaseFrequencyが .inherit、.never、および.workItemを持つ新しいタイプであることがわかります。これらはどういう意味ですか?私は GCDとオートリリースに関する研究を行ったが、私は 自動解放プールの概念に詳しくは慣れていない。

これまで、DispatchQueuesは、スレッドが非アクティブになったときに、指定されていない時間に自動解放プールをポップします。実際には、これは、送信したディスパッチ項目ごとに自動解放プールを作成したか、または自動リリースされたオブジェクトが予測不能な時間内にハングすることを意味していました。

非決定論を持っている素晴らしいものではありませんので、彼らは今、あなたは3つの動作のいずれかを指定することができます(特に並行処理ライブラリに!):

.inherit:わからない、おそらく以前のデフォルトを行動

.workItem:

を実行されます各項目の自動解放プールを作成し、ドレイン。決して:GCDは自動解放プールを管理していません

これらの中でも、アイテムが完成したら一時オブジェクトをクリーンアップするため、単に.workItemを使用したいと思う可能性があります。他のオプションは、古い動作に依存するバグのあるコードや、実際にこのようなものを管理したいと思うまれなユーザーのためのものでしょう。


あなたが(彼らは任意のObjective-Cのコードに呼び出すことはありません)スウィフト専用されている作業項目を提出している場合実際には、もう少しそれについて考え、そして.neverはおそらく正しい安全&です。スウィフトの標準ライブラリクラスでObjective-Cコードを呼び出すことができれば、これを自分のSwiftコード内にある計算に限定したいと思うでしょう。

+2

アップルでは、​​しばしば新しいことを文書化しにくい習慣があり、ドキュメンテーションをやり直すかどうかについて、ヒットしたり、逃したりする可能性があります。 'UIInputView'の' allowsSelfSizing'プロパティは、iOS 9以来存在していました。ドキュメントには何の効果があるのか​​を説明するために追加されていませんし、サイズを変更できるように設定されていても効果はありません。 – Gavin

15

「主観的な」マークの答えは、ドキュメントに公式な文書はまだありません。しかし、公式のドキュメンテーションをコードで見つけることができるので、純粋にコードのドキュメンテーションにあるものに基づいており、意見に基づいているわけではないので、正しい答えでなければならないと信じているものを与えています。ここでは、次のとおりです。この自動解放周波数で ディスパッチキューがそのターゲット・キューから動作を継承

DISPATCH_AUTORELEASE_FREQUENCY_INHERIT。これは手動で作成されたキューのデフォルト動作です。

この自動解放周波数押すだけでDISPATCH_AUTORELEASE_FREQUENCY_WORK_ITEM ディスパッチキューと非同期的に提出されたすべてのブロックの実行の周りに自動解放プールをポップ。非同期的に提出されたブロックの実行を中心に個々の自動解放プールを設定することはありません。この自動解放周波数で

DISPATCH_AUTORELEASE_FREQUENCY_NEVER ディスパッチキュー。これは、グローバル並行キューの動作です。