問題タブ [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.

0 投票する
1 に答える
150 参照

swift - デタッチされたタスク内から呼び出されたときに MainActor.run がクロージャの実行に失敗する

にクロージャーを渡して、切り離されたタスクのステータスを更新しようとしたときに問題が発生しましたMainActor.run

この問題を説明するために、フォルダーとそのサブディレクトリ内のファイル数をカウントする関数を考えてみましょう。Task.detachedメインスレッドをブロックしたくないので、クロージャーで実行されます。10,000 番目のファイルごとに、クロージャを に渡すことによって、Publishedプロパティを更新します。fileCountMainThread.run

ただし、UI の更新に失敗し、回転するビーチ ボールが表示されることさえあります。これを止める唯一の方法は、await Task.sleep(1_000_000_000)への呼び出しの前に挿入することMainThread.runです。コードは次のとおりです。

これを達成する古い方法に戻ると、コードは機能します。

私は何を間違っていますか?

ところで、このコードを試してみたい場合は、ここにテスト ハーネスがあります。たくさんのファイルが含まれるフォルダーとそのサブフォルダーを必ず選択してください。

0 投票する
1 に答える
177 参照

swift - 非同期自動解放プール

を使用してループ内で多くの Cocoa オブジェクトを作成している状況がありasync/awaitます。オブジェクトは (反復ごとではなく) ループが終了したときにのみ解放されるため、メモリが急増します。

解決策は、を使用することautoreleasepoolです。autoreleasepoolしかし、私はと仕事をすることができないようですasync/await

次に例を示します。

メモリは 220MB まで急増しますが、これは私には少し多すぎます。

通常、内側のループを でラップするautoreleasepoolと問題は解決しますが、関数で試してみると、次のasyncエラーが発生します。

これを回避する方法はありますか?または、ループ内で Cocoa オブジェクトを解放するという同じ目標を達成する別の方法はありますか?

0 投票する
1 に答える
334 参照

swift - Core Data を使用した await withTaskGroup が失敗することがある

Swift 5.5 で async/await 同時実行を使用して、次の taskGroup を作成しました。ここでは、onboardingMeterCore Data から取得して、メーターを反復処理します。これは 5 回中 4 回程度は問題なく動作しますが、その後 iOS アプリがクラッシュします。iOS デバイスからアプリを削除してこれをテストし、最初からオンボーディングを実行します。これを 4 回、5 回、または 6 回連続して問題なく実行できる場合がありますが、次のエラーで突然クラッシュします。

これは失敗したコードであり、let onboardingMeter = await OnboardingMeter.fromMeterDict返されることはありません。失敗したときに2番目のprintステートメントが表示されません。

これは Swift ベータ版のエラーですか、それともここで間違いを犯したのでしょうか? 新しい iOS 15 ベータ版がリリースされ、iOS 15 の正式リリースが発表されたら、もう一度試してみます。

OnboardingMeter.fromMeterDict機能:

そしてfindOrCreateInstance:

0 投票する
0 に答える
95 参照

swift - スレッド 1: ネットワーク要求を行うたびに EXC_BAD_ACCESS (code=EXC_I386_GPFLT) が発生する

アプリを実行して要求ユーティリティを使用するたびに、奇妙なクラッシュが発生します。

これはXCode Beta 13.5にあります

私も Thread Sanitizer を使用していることに言及する必要があります。このエラーは、Thread Sanitizer がオンになっている場合にのみ表示されます。

コードは次のとおりです。

まず、クリックするとデータを送信するボタンがあります

これは submitData 関数です

これは AuthenticationAPI.login 関数です

最後に、これはネットワーク呼び出しです

executeRequest 関数は、要求を作成しないため呼び出されません (ローカル サーバーを確認しました)。

これらはスレッド ログです。