2011-02-15 10 views
1

この質問は、私とは違って、本当にがココアアプリでマルチスレッドを理解している人のためのものです。ここでは、簡単に、状況です:他のバックグラウンドスレッドからバックグラウンドスレッドを起動できますか? (NSObj)

状況:
私のアプリはNSObjectの中で提供された方法を使用して並行性を実現します。

1)私のメインビューコントローラがUI解放するためにバックグラウンドでいくつかの作業を起動:

​​

2)バックグラウンドの仕事はにそのタスクを分割し、次の手順を実行しても大丈夫であれば教えてくださいそれが終わると、各タスクが更新されるように、より多くのバックグラウンドスレッド上のいくつかの小さなタスク(すべてのタスクが完了したときではなく):

[self performSelectorInBackground:@selector(loadOneImage:) withObject:nil]; 

は理論的根拠:
これは、UIが更新されるごとに個々のタスク(カスタムUIViewのロード/描画)をセットするために発明できる唯一の方法でした。それ以外の場合は、グループ内の最後のタスクが完了したときにすべてのタスクのみが更新されます。

答えて

3

はい、performSelectorInBackground:...コールを使用してセカンダリスレッドからセカンダリスレッドを生成できます。

(この方法で)スポーンするスレッドが多い場合は、NSOperationQueueと考えてください。そうしないと、大量のバックグラウンドスレッドが発生する可能性があります。モバイルデバイスで1つのイメージをロードするたびに100スレッド(リソースを使い果たしても反応しません)。 NSOperationQueueはスレッド/ワーカーの最大数を制限し、ワーカースレッドを再利用します。

メモ:数値がハードウェアの論理をはるかに超えているため(「タグ付きiPhone」)、「100スレッド」が使用されました。あなたの画像の読み込みがすべてメモリ内にある場合は、シリアル(一度に1人の作業者)だけを使用してください。NSOperationQueue - NSOperationsが優先度を指定することがあります。画像がダウンロードされている場合は、4以下に固執することができます。

ハードウェアプラットフォームが変更されると、これらの番号が変更されるため、使用可能なコアとリソースが増えているOS Xでは状況が異なります。 OS Xでは、1つのアプリケーションで100個のスレッドを正常に使用できますが、ほとんどのアプリケーションではそのスレッドの近くに何かが必要なことは珍しいことです。

+0

ありがとうございます。セカンダリスレッドのメソッドは今のところうまく動作していますが、同時に非常に多くのことが起こっています。これは私のUIをちょっと遅くしています。だから私はNSOperationQueueを見て、何か違いがあるかどうかを見ていきます。 – m0rtimer

1

私が見る限り、このアプローチには何も問題はありません。ドキュメントによると、performSelectorInBackground:withObject:は別のスレッドを生成してそこのセレクタを実行します。制限事項は記載されていません。 performSelectorInBackground:withObject:経由で呼び出した各メソッドに自動解放プールを設定して、メモリがリークしないようにすることを忘れないでください。

+0

あなたの答えDarkdustに感謝します。私がまだ安全地帯にいることを知りました。私はまだNSOperationQueueが実際のパフォーマンス上の利点を提供するかどうかをチェックする必要があります。 – m0rtimer

1

重要な条件の1つを確認してください。バックグラウンドで実行されている両方のスレッドは、依存関係を持つべきではありません。彼らが持っているならば、あなたは不一致で終わるかもしれません。

別のバックグラウンドスレッドからスレッドを生成するのではなく、操作キューを使用する場合は、

関連する問題