タグ付けされた質問 「grand-central-dispatch」

Grand Central Dispatch(GCD)は、主にAppleオペレーティングシステム(iOS、macOS、watchOS、tvOSなど)だけでなく、FreeBSDとMidnightBSDでも、同時および非同期操作のためのシンプルで堅牢なメカニズムを提供します。


24
dispatch_after-SwiftのGCD?
iBookを使用しました Apple定義を見つけることができませんでした。 誰かが構造を説明できますかdispatch_after? dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)

8
NSOperation vs Grand Central Dispatch
iOS用の並行プログラミングについて学んでいます。これまで、NSOperation/NSOperationQueueとについて読みましたGCD。over を使用する理由とその逆の理由は何ですか?NSOperationQueueGCD 両方のような音GCDやNSOperationQueue抽象化を明示的に作成するNSThreadsユーザから。ただし、2つのアプローチの関係は明確ではないため、フィードバックをお待ちしています。

13
Swift 3、4、および5でdispatch_after GCDを書き込むにはどうすればよいですか?
Swift 2では、dispatch_afterグランドセントラルディスパッチを使用してアクションを遅らせることができました。 var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) dispatch_after(dispatchTime, dispatch_get_main_queue(), { // your function here }) しかし、これはSwift 3以降、コンパイルされなくなったようです。現代のSwiftでこれを書くための好ましい方法は何ですか?


10
Objective-CでGCDのdispatch_onceを使用してシングルトンを作成する
iOS 4.0以上をターゲットにできる場合 GCDを使用して、Objective-C(スレッドセーフ)でシングルトンを作成する最良の方法ですか? + (instancetype)sharedInstance { static dispatch_once_t once; static id sharedInstance; dispatch_once(&once, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }

4
メインスレッドでタスクを実行するGCD
任意のスレッドからのコールバックがあります。このコールバックを受け取ったら、メインスレッドで特定のタスクを実行したいと思います。 私がすでにメインスレッドにいるかどうかを確認する必要がありますか?または、以下のコードを呼び出す前にこのチェックを実行しないことによるペナルティはありますか? dispatch_async(dispatch_get_main_queue(), ^{ // do work here });

6
Swift 3、Swift 4以降で、dispatch_sync、dispatch_async、dispatch_afterなどを行うにはどうすればよいですか?
Swift 2.x(または1.x)プロジェクトに次のようなコードがたくさんあります。 // Move to a background thread to do some long running work dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { let image = self.loadOrGenerateAnImage() // Bounce back to the main thread to update the UI dispatch_async(dispatch_get_main_queue()) { self.imageView.image = image } } または、実行を遅らせる次のようなもの: dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { print("test") } または、Grand Central …

9
SwiftでGCDメインスレッドのパラメーターでメソッドを呼び出す方法は?
私のアプリには、NSRURLSessionを作成してNSURLRequestを送信する関数があります。 sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) このタスクの完了ブロックでは、UIImageを呼び出し側のビューコントローラーに追加する計算を行う必要があります。という機能があります func displayQRCode(receiveAddr, withAmountInBTC:amountBTC) UIImageを追加する計算を行います。完了ブロック内でビュー追加コードを実行しようとすると、Xcodeは、バックグラウンドプロセス中にレイアウトエンジンを使用できないことを示すエラーをスローします。だから私はメインスレッドでメソッドをキューに入れようとするSOのコードを見つけました: let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC))) dispatch_after(time, dispatch_get_main_queue(), { let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil) }) ただし、この関数呼び出しにパラメーター「receiveAddr」および「amountBTC」を追加する方法がわかりません。これをどのように行うのですか、または誰かがアプリケーションのメインキューにメソッド呼び出しを追加するための最適な方法を提案できますか?

10
別のブロックを開始する前に、2つの非同期ブロックが実行されるまで待機する
GCDを使用する場合、2つの非同期ブロックが実行されて完了するまで待ってから、次の実行ステップに進みます。それを行う最良の方法は何ですか? 以下を試しましたが、うまくいかないようです: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block1 }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block2 }); // wait until both the block1 and block2 are done before start block3 // how to do that? dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ { // block3 });

13
非同期にディスパッチされたブロックが完了するのを待つにはどうすればよいですか?
Grand Central Dispatchを使用して非同期処理を行うコードをいくつかテストしています。テストコードは次のようになります。 [object runSomeLongOperationAndDo:^{ STAssert… }]; テストは、操作が完了するまで待機する必要があります。私の現在の解決策は次のようになります: __block BOOL finished = NO; [object runSomeLongOperationAndDo:^{ STAssert… finished = YES; }]; while (!finished); 少し粗雑に見えますが、もっと良い方法を知っていますか?キューを公開し、次を呼び出すことでブロックできますdispatch_sync: [object runSomeLongOperationAndDo:^{ STAssert… }]; dispatch_sync(object.queue, ^{}); …しかしそれは多分多分に露出していることobjectです。

8
非同期ネットワークリクエストを含むSwift forループの実行が完了するまで待機します
for inループで一連のネットワークリクエストをfirebaseに送信し、メソッドの実行が完了したら、データを新しいビューコントローラーに渡します。これが私のコードです: var datesArray = [String: AnyObject]() for key in locationsArray { let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)") ref.observeSingleEventOfType(.Value, withBlock: { snapshot in datesArray["\(key.0)"] = snapshot.value }) } // Segue to new view controller here and pass datesArray once it is complete 私にはいくつかの懸念があります。最初に、forループが終了してすべてのネットワーク要求が完了するまで、どのように待つのですか?observeSingleEventOfType関数は変更できません。FirebaseSDKの一部です。また、forループのさまざまな反復からdatesArrayにアクセスしようとすることで、ある種の競合状態を作成しますか(意味があると思います)。私はGCDとNSOperationについて読んでいましたが、これは私が作成した最初のアプリであるため、少し迷っています。 注:Locations配列は、firebaseでアクセスする必要があるキーを含む配列です。また、ネットワーク要求が非同期で発生することも重要です。すべての非同期リクエストが完了するまで待ってから、datesArrayを次のビューコントローラーに渡します。

6
iPhone-Grand Central Dispatchメインスレッド
私は私のアプリで大規模な中央ディスパッチを使用して成功していますが、次のようなものを使用することの本当の利点は何ですか? dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff あるいは dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff つまり、どちらの場合も、アプリが実行される場所であるメインスレッドで実行されるブロックを起動しているため、これは負荷の軽減に役立ちません。最初のケースでは、ブロックを実行するタイミングを制御できません。ブロックを発射してから0.5秒後にブロックが実行されるケースを見てきました。2番目のケースは、 [self doStuff]; 正しい? 君たちはどう思う?

3
シリアルキューのdispatch_asyncとdispatch_syncの違いは?
私はこのようなシリアルキューを作成しました: dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL); dispatch_asyncこのように呼ばれるの違いは何ですか dispatch_async(_serialQueue, ^{ /* TASK 1 */ }); dispatch_async(_serialQueue, ^{ /* TASK 2 */ }); そしてdispatch_sync、このシリアルキューでこのように呼ばれましたか? dispatch_sync(_serialQueue, ^{ /* TASK 1 */ }); dispatch_sync(_serialQueue, ^{ /* TASK 2 */ }); 私の理解では、使用されるディスパッチ方法に関係なく、のTASK 1前TASK 2に実行および完了されます。

6
GCDの並行キューとシリアルキュー
GCDの並行キューとシリアルキューを完全に理解するのに苦労しています。私にはいくつかの問題があり、誰かがはっきりとその時点で私に答えてくれることを願っています。 私は、シリアルキューが次々とタスクを実行するために作成および使用されることを読んでいます。ただし、次の場合はどうなりますか。 シリアルキューを作成します dispatch_async(作成したばかりのシリアルキューで)3回使用して、3つのブロックA、B、Cをディスパッチします 3つのブロックが実行されますか: キューがシリアルであるため、順序A、B、C または 並行して(並列スレッドで同時に)、ASYNCディスパッチを使用したため dispatch_syncブロックを次々に実行するために並行キューで使用できることを読んでいます。その場合、シリアルキューが存在するのはなぜですか?必要なだけブロックをSYNCHRONOUSLYディスパッチできるコンカレントキューを常に使用できるので、なぜですか? 良い説明ありがとうございます!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.