2012-02-27 14 views
0

あなたの助けが必要です。iosでのマルチスレッド化

私のアプリケーションでは、私は継続的に動作し続け、更新されたデータをダウンロードしてドキュメントフォルダに保存するバックグラウンドプロセスを実装したいと思います。

そして、私のメインスレッドは、ドキュメントフォルダをチェックし続け、更新されたデータをビューコントロールに表示する必要があります。

ビューが消えると、子スレッドは終了します。ビューが表示されたらもう一度開始してください。

どのような方法が最適ですか? NSThreadまたはNSOperationQueue?どのような予防措置が必要ですか? 私はまた、クラスのいくつかの変数にアクセスする必要があります。だから、スレッドセーフでなければなりません。

ありがとうございます。

よろしく

+0

多くのことを試しました。私の目標を達成できませんでした。誰でも私に何かを提案できますか?バックグラウンドで連続して実行されるスレッドを作成したい。それは私が繰り返し10-20イメージをダウンロードするwhile(1)ループを持ちます。ダウンロードはスレッド内で同期/非同期で行われます。非同期呼び出しでは、私が直面する問題は成功/失敗コールバック関数が呼び出されないことです。同期の呼び出しでは、私が直面している問題は、私はURLの要求でユーザー名とパスワードを送信することができないです。 – Nir

答えて

2


あなたはNSOperationQueue内部ブロックとして非同期ダウンロードを実行することを可能にする一つの大きなAPIメソッド+ sendAsynchronousRequest:queue:completionHandler:があるiOS5を中にプログレスバーか何かを更新する必要がない場合。そうでない場合は、ASIHTTPリクエストやhttps://github.com/AFNetworking/AFNetworking(おそらく最後の方がよい)などのサードパーティのライブラリを調べるか、単純なタスクではなく独自のダウンロードマネージャを構築する必要があります。

+0

あなたの提案をありがとう。私はデータをダウンロードしたいだけではありません。しかし、スレッドで他のタスクを実行する必要があります。第二に、それはバックグラウンドで実行し続ける必要があります。 sendAsynchronousRequest:queue:completionHandler:それを行う最善の方法だと思いますか? – Nir

+0

ダウンロード中に入ってくるデータで何かをする必要があるかどうかによって決まります。競合ハンドラで何かする機会が与えられているからです。あなたがダウンロードする必要があるファイルが本当に大きい例を教えてください。この場合、最後にデータが来るだけでなく、データを追加するストリームまたはファイルハンドラを選択します。私はあなたがAFNetoworkingを見て、NSURLconnectionメソッドのまさに「単純な」ラッパーであるべきだと思います。 – Andrea

+0

ありがとうございました。 AFNetoworkingを経由します。 – Nir

0

2つの方法があります。

最初に:GCD上にビルドされているものの、いくつかの追加機能があるため、少しばらつきのあるNSOperationQueueを使用します。

2番目:GCD(グランドセントラルディスパッチ)を使用していますが、これは少し速くなるスレッド(メインまたはバックグラウンド)に簡単にアクセスできるので、GCDがうまくいくようです。

+0

これは非同期呼び出しのために機能しますか? – Nir

+0

非同期の背後にある考え方は、バックグラウンドスレッドで何かをして、通常はUI用のメインキューに影響しないようにすることです。したがって、これはこれらの目的であり、非同期動作を提供します。 –

+0

正確には、すべてのNSURLConnectionコールバックがメインスレッドで機能していると誤解されていません。現在のスレッドを要求するログを置くことができます。セカンダリスレッドで実行ループを作成しない場合、このスレッドはデリゲートメソッドを受け取ることはありません。非同期接続は、非同期であるためメインをブロックしません。したがって、実行ループの各サイクルごとにデータをチャンクに付加します。さらに、デリゲートのコールバックからわかるように、完了までにあまり時間がかかりません。 NSOperationQueue ioS4は新しいスレッドですべての操作を実行するので、ループを作成しない場合はすべてを意味します。 – Andrea

0

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)argこのメソッドは、アプリケーションに新しいスレッドを作成し、アプリケーションがマルチスレッドモードになっていない場合はそのスレッドを作成します。あなたのviewDidDisappearでは、あなたのビューが消えるときにタスクを停止することができます

アップルから。 Appleは並行処理を実装するためのMac OS Xの代替技術を調査することを奨励しています。特に、スレッド化されたアプリケーションを実装するために必要な設計手法に精通していない場合は、これが当てはまります。これらの代替テクノロジは、実行の同時パスを実装するために必要な作業量を簡素化し、従来のスレッドよりもはるかに優れたパフォーマンスを提供します。 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html#//apple_ref/doc/uid/10000057i-CH6-SW2

+0

分かりやすくするため、これは同期接続を使用して動作します。非同期接続の場合は、接続が完了しました。新しいスレッドを持っていても、実行ループが十分に生きているわけではありません。 – Andrea

+0

@アンドレア私はこの問題に直面しています。スレッドで非同期呼び出しを使用しています。これが問題となっています。だからスレッドで非同期呼び出しを使用する最良の方法は何ですか?私はNSThreadとGCDを使ってみました。どちらの場合も私は同じ問題に直面しています – Nir

+0

@アンドレア私はNSOperationを試しています。 – Nir

関連する問題