問題タブ [swift-concurrency]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - デタッチされたタスク内から呼び出されたときに MainActor.run がクロージャの実行に失敗する
にクロージャーを渡して、切り離されたタスクのステータスを更新しようとしたときに問題が発生しましたMainActor.run
。
この問題を説明するために、フォルダーとそのサブディレクトリ内のファイル数をカウントする関数を考えてみましょう。Task.detached
メインスレッドをブロックしたくないので、クロージャーで実行されます。10,000 番目のファイルごとに、クロージャを に渡すことによって、Published
プロパティを更新します。fileCount
MainThread.run
ただし、UI の更新に失敗し、回転するビーチ ボールが表示されることさえあります。これを止める唯一の方法は、await Task.sleep(1_000_000_000)
への呼び出しの前に挿入することMainThread.run
です。コードは次のとおりです。
これを達成する古い方法に戻ると、コードは機能します。
私は何を間違っていますか?
ところで、このコードを試してみたい場合は、ここにテスト ハーネスがあります。たくさんのファイルが含まれるフォルダーとそのサブフォルダーを必ず選択してください。
swift - 非同期自動解放プール
を使用してループ内で多くの Cocoa オブジェクトを作成している状況がありasync/await
ます。オブジェクトは (反復ごとではなく) ループが終了したときにのみ解放されるため、メモリが急増します。
解決策は、を使用することautoreleasepool
です。autoreleasepool
しかし、私はと仕事をすることができないようですasync/await
。
次に例を示します。
メモリは 220MB まで急増しますが、これは私には少し多すぎます。
通常、内側のループを でラップするautoreleasepool
と問題は解決しますが、関数で試してみると、次のasync
エラーが発生します。
これを回避する方法はありますか?または、ループ内で Cocoa オブジェクトを解放するという同じ目標を達成する別の方法はありますか?
swift - Core Data を使用した await withTaskGroup が失敗することがある
Swift 5.5 で async/await 同時実行を使用して、次の taskGroup を作成しました。ここでは、onboardingMeter
Core Data から取得して、メーターを反復処理します。これは 5 回中 4 回程度は問題なく動作しますが、その後 iOS アプリがクラッシュします。iOS デバイスからアプリを削除してこれをテストし、最初からオンボーディングを実行します。これを 4 回、5 回、または 6 回連続して問題なく実行できる場合がありますが、次のエラーで突然クラッシュします。
これは失敗したコードであり、let onboardingMeter = await OnboardingMeter.fromMeterDict
返されることはありません。失敗したときに2番目のprintステートメントが表示されません。
これは Swift ベータ版のエラーですか、それともここで間違いを犯したのでしょうか? 新しい iOS 15 ベータ版がリリースされ、iOS 15 の正式リリースが発表されたら、もう一度試してみます。
OnboardingMeter.fromMeterDict
機能:
そしてfindOrCreateInstance:
swift - スレッド 1: ネットワーク要求を行うたびに EXC_BAD_ACCESS (code=EXC_I386_GPFLT) が発生する
アプリを実行して要求ユーティリティを使用するたびに、奇妙なクラッシュが発生します。
これはXCode Beta 13.5にあります
私も Thread Sanitizer を使用していることに言及する必要があります。このエラーは、Thread Sanitizer がオンになっている場合にのみ表示されます。
コードは次のとおりです。
まず、クリックするとデータを送信するボタンがあります
これは submitData 関数です
これは AuthenticationAPI.login 関数です
最後に、これはネットワーク呼び出しです
executeRequest 関数は、要求を作成しないため呼び出されません (ローカル サーバーを確認しました)。
これらはスレッド ログです。