問題タブ [nsblockoperation]
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.
objective-c - Core-Data の奇妙な動作
を使用していくつかの作業を実行し、NSBlockOperation
このブロック内で永続ストアが永続ストアを失います。
次のコード:
これをログアウトします:
管理対象オブジェクトのコンテキストは < NSManagedObjectContext: 0xa46ff10 > です
----->削除コンテキストの永続ストアには 1 つのストアがあります
操作ブロックの管理オブジェクト コンテキストは < NSManagedObjectContext: 0xa46ff10 > です
オペレーション ブロックの永続ストア コーディネーターは < NSPersistentStoreCoordinator: 0xa1a45e0 > です。
操作ブロックの削除コンテキストの永続ストアにストアがありません
*キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'この NSPersistentStoreCoordinator には永続的なストアがありません。保存操作を実行できません。
このストアの突然の喪失の理由はわかりません。これは、メモリ内ストアを使用するように設定したテスト スイートで実行されておりNSOperationQueue
、ブロックを実行するこれとメモリが共有されていないためでしょうか?
objective-c - NSBlockOperation はシリアルですか?
ブロックごとにブロックを追加し続けることができます。それらは連続して実行されますか?
そうでない理由が思い浮かびません。具体的なことは何もありません。
これは NSOperationQueue ではありません。これは、複数のブロックを持つこともできる NSBlockOperation です。
ios - NSOperationQueue の addOperation: 操作が終了し、キューに入れることができませんか?
注:
これは単なる概念実証です。
実際のバックグラウンド タスクは、生データの「HTTP Get」を継続的に要求し、メイン スレッドを介して表示することです。オンデマンド。
シナリオ:
1) オンデマンドでバックグラウンド タスク (ループ) を切り替えます。
2) バックグラウンド タスクは、反復ごとにメイン スレッド UI に通知します。
3) キューで実行されるブロック操作は 1 つだけです。
操作方法 1) NSBlockOperation
を使用して、バックグラウンド コードを含めます。
2) 地域の BOOL を使用してループを切り替えます。IBAction経由。
問題
1) コンパイラは BOOL 'isRunning' に強力なリンクとしてフラグを立てています。
このブロックで「自己」を強くキャプチャすると、保持サイクルが発生する可能性があります。
2) ブロック操作を追加する前に、キューに操作があるかどうかを確認しました。
しかし、私は常に次のエラーが発生します。
-[NSOperationQueue addOperation:]: 操作が終了し、キューに入れることができません
この概念実証は、記載されている問題に加えて、機能しているようです。
質問:
1) BOOL が単なるスケーラーであるのに、なぜコンパイルは BOOL 'running' を強い行としてフラグを立てているのですか?
2) キューに何も見つからない場合、別の NSBlockOperation を追加して NSOperationQueue を再利用できないのはなぜですか?
以下はコード全体です。
コンソール出力:
ios - オーディオ ファイル フォーム サーバーを同期的にダウンロードする際のエラー
NSBlockOperation
サーバーからオーディオファイルをダウンロードしてドキュメントディレクトリに保存しようとしているを使用しています。
オーディオ ファイルをダウンロードするために同期呼び出しを行いました。しかし、時間がかかりすぎて、長い時間が経過すると NSData のゼロバイトが返されます。60 秒間タイムアウトしたリクエストが原因だと思いました。次に、タイムアウト要求を削除しましたが、問題はそのままです。私のクエリは
- タイムアウトはサーバー接続に関連しており、サーバーからのデータの取得には関連していません
- サーバーからのゼロバイト応答の理由は何ですか。
ios - UIWebView で強力な NSBlockOperation を設定します。これは悪い考えですか?
アプリで興味深い問題をデバッグしています。
アプリは iOS6.1 を対象としており、ARC を使用しています。SOにコピーペーストするには大きすぎるため、ここにいくつかの背景があります。
子ビュー コントローラーを持つダッシュボード クラスがあります。この子ビュー コントローラーはかなり大きく、ダッシュボード コントローラーが渡す CoreData オブジェクトに基づいて動的に作成される 2 つのスクロール ビューのボタンがあります。ダッシュ ボード コントローラーが子コントローラーで完了すると、それを破棄し、別のコア データ オブジェクトを使用して別のコントローラーを作成します。
動的に作成されて UIScrollView に詰め込まれる子コントローラーのビューの 1 つは、UIWebView のサブクラスです。これをサブ Web と呼びましょう。SubWeb のインスタンスが作成されると、NSOperationBlock を使用して、ネットワーク経由でファイルのフェッチを行い、他の処理 (ディスクへの書き込み、暗号化など) も行います。完了したら、ファイルまたは Web ページを SubWeb インスタンスに挿入できる必要があります。
SubWeb に強力なプロパティを与えることでこれを解決しました。これは私の問題です。私のクリーンアップでは、子ビュー コントローラーまたはサブビューを破棄することはできません。これは、私のクラスを対象とした楽器割り当て調査で確認しました。子ビュー コントローラー (および SubWeb オブジェクト) を作成および破棄することにより、アプリがクラッシュするまで、子ビュー コントローラーとサブ wWeb オブジェクトの両方のメモリ割り当てを確認できます。奇妙なのは、NSBlockOperation を weak に設定すると、破棄ルーチンが期待どおりに動作することです。
開始する実際のファイルを含むいくつかの SubWeb オブジェクトをフロントロードするだけなので、強力な参照が必要です。ユーザーがそれらにスクロールすると、プロパティをプッシュして必要なファイルを遅延ロードします
子ビュー コントローラーと SubWeb ビューのインスタンスがクリーンアップされていない場合に参照している WebView を次に示します。
クリーンアップされたときの WebView を次に示します (ただし、必要なときに遅延ブロック操作が null になるようになりました:
唯一の違いは、強いタイプと弱いタイプです。このタイプの遅延読み込みアクションに NSBLockOperation を使用したことのある人はいますか? 遅延ロードを解決するために使用できる異なる/より良い方法はありますか?
ios - NSBlockOperation とキューを使用した NSURLSession
NSURLConnection
現在、ネットワークの大部分を使用しているアプリがあります。に移行したいのはNSURLSession
、Apple がそれが進むべき道だと言っているからです。
私のアプリは、クラス メソッドNSURLConnection
を介して の同期バージョンを使用するだけです。+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
これはNSBlockOperation
実行中に行うNSOperationQueue
ため、メイン キューを不必要にブロックすることはありません。このようにすることの大きな利点は、操作を相互に依存させることができることです。たとえば、データを要求するタスクをログイン タスクの終了に依存させることができます。
内での同期操作のサポートは見たことがありませんNSURLSession
。私が見つけることができるのは、それを同期的に使用することさえ考えていることで私を嘲笑し、スレッドをブロックするのは恐ろしい人であるという記事だけです。罰金。しかし、NSURLSessionTask
s を相互に依存させる方法はありません。それを行う方法はありますか?
または、そのようなことを別の方法で行う方法についての説明はありますか?
ios - 自己への強い参照を使用するブロックの実行中に自己の @property 値を変更する
私は自分のアプリでネットワーク リクエストを実行する作業を行っており、NSOperationQueue で NSBlockOperations を使用してこれを非同期的に実行しています。ただし、これらの操作を呼び出したView Controllerの割り当てが解除された場合(ナビゲーションスタックからポップされた場合)、これらの操作をキャンセルできるようにしたいと考えています。
これは私が持っているものの簡略化されたバージョンです:
DataControllerの refreshPostsInPart:
メソッドでは、while ループを使用して、App.net からページ分割されたデータに対して繰り返しネットワーク リクエストを行います。ループの反復ごとに、DataController self.isCancelled
(BOOL 型) のプロパティをチェックし、そうであれば、NO
リクエストを作成し続けます。
dealloc
DataControllerのメソッドで、このプロパティを に設定YES
して、while ループの次の繰り返しでリクエストの作成を停止します。cancelAllOperations
本質的に、 NSBlockOperation を使用している間、私は貧乏人を実装しています。
質問:私の dealloc メソッドで を設定self.isCancelled
するとき、ブロックで使用されている strongSelf 参照も設定していますか?NO
self.isCancelled
ios - ブロック内の NSBlockOperation とオブジェクト
簡単なコードは次のとおりです。
someString が解放されてから nsblockoperation が実行されると、このコードはクラッシュします。これを防ぐためのベストプラクティスは何ですか?
ありがとうございました。
編集:ARCは私の決定ではないため、選択ではありません。MRCでこれを回避する方法はありますか?
EDIT2:次のコードはどうですか? それはうまくいくでしょうか?