2011-01-25 9 views
0

短い背景:私は現在、Mac用のXcodeでプログラムを作成しています。これは概念的にはコード全体ではありませんが、 iPhone。それは、外部センサーからのブルートゥースを通して絶えずデータを受信することを含む(ユーザーインタラクションに関係なく、データを受信しなければならない)。私はMacでIOBluetoothを使って簡単なプログラムを作っています。ペアでデータを受け取ることができます.BTstackとjailbroken iPhoneを使って、iPhoneのBluetoothチップにアクセスする予定です。分析するココアプログラムのプログラムレイアウトと保存に関する提案

私はあまりにも遠くなる前に、私は手続き型プログラミングに慣れていてObj-Cは私の新しい獣なので、概念的にこのプログラムを正しくレイアウトしたいと思っています。私が述べたように、私はiPhoneに移動するときにできるだけ多くのコードを保存できるようにしたいと思っています(私はビューなどのために異なるクラスがあることを理解していますが、類似点はあります)。

1)私のプログラムでは、ユーザーの操作に関係なく、常にバックグラウンドでデータを受信します(つまり、ユーザーがプログラムを起動してBTデバイスを選択すると、データが流れます)。それ以前にそのデータをユーザに提示することができる。だから(質問)、どのようにこれをレイアウトするだろうか?私はすべての私のBTコードをappdelegateに置くことを考えていました。そして、View Controllerを持っていました(Macでは、ウィンドウを扱うものになりますが、iPhoneでは複数のサブビューコントローラを持つタブコントローラになります)。 「コントローラ」(この場合はappdelegate)によってアクセスされるデータ(将来の参照のためのログファイルとしても)を分析して格納するモデルです。このレイアウトは理にかなっていますか?それはkosher MVC/CocoaのすべてのBTコードと分析をappdelegateに入れるか、それとも自分のクラスに入れるべきか(macとiPhoneの両方のBTコードが絶えずデータのバーストを受信しなければならないことを知っている) ?どのように改善することができますか?

2)分析側の関連する質問。私は、解析を行っているネット上にある単一のCocoaサンプルを見つけられませんでした(私はプログラムを見つけましたが、使用するモデルの説明はありません)。保存される基本データは1時間あたり〜50kBと非常に小さいです。しかし、結果(スペクトルと滝のプロットを含む)は1時間あたり2MBを超える可能性があります(これは1日に数時間実行するプログラムです)。 「外出先で」分析し、わかっているスクロールバッファーに結果をスローするのは非常に速いですが、ユーザーが過去の特定の時間セグメントを振り返ることができるようにしたいと考えています。私が持っている質問は、モデルオブジェクトがデータを分析して結果を基本データと一緒に保存するか、モデルが基本データのみを保存し、そのデータをコントローラに返して分析し、それを分析してビューに提示するべきかということですこれは非常にCPUの重い場合は、データを数分もregraphing、時間を聞かせて)?

私が適切な基礎を築いていると感じたら、後で何時間ものコーディング(および固定/デバッグ)を省くことができると思っています。あなたの質問1については

答えて

1

私はあなたが別途アプリデリゲートから、bluetoothのデータを管理するクラス/オブジェクトを記述することをお勧めします。アプリケーションデリゲートは、ビューオブジェクトがコントローラと出会う場所です。そのため、AppKit(OS X)とUIKit(iOS)には多くの呼び出しがあります。変更は非常に大きいので、同じファイル内のOS間の#ifdefは、アプリケーションデリゲートにはあまり意味がありません。

むしろ、Bluetoothコントローラーをアプリケーションデリゲートの中に入れたままにしておきます。そうすれば、コードがより構造化され、再利用しやすくなります。通常、それは時間あたり2メガバイトだ場合はRAM上のすべての結果のデータを保持し、キャッシング、これらの日は、ちょうどいいと思いRAMの多くが付属していたOS Xマシン上で

:あなたの質問2については

iOSマシンでは、RAMは深刻な危険にさらされているリソースです。あなたのプログラムが計算されたデータをメモリにキャッシュし、多くのRAMを消費し、ユーザがバックグラウンドにそれを送ると、OSはサスペンドするのではなく、あなたのプログラムを完全に殺すかもしれません。とにかく、あなたのアプリが再起動されたので、データを再計算する必要があります。

ファイルシステムの容量は、iOSマシンでも非常に大きいです。そこで、計算されたデータをディスクに書き込んで、ビューコントローラにそこから以前に計算されたデータをリロードさせる方法があります。そうすれば、プログラムは再起動した後でも事前に計算されたデータにアクセスできます。

キャッシュディレクトリをプログラムにハードコードしないと、そのキャッシュコードをOS XとiOSで共有することさえできます。

+0

ありがとう。あなたが書いたことを理解してください:AppDelegateだけを残して(アプリ起動後の処理を行う)、Bluetoothデータの受信と解析のためのコントローラ、ビューコントローラ(iPhoneのタブビュー用のネストされたもの) 、最後にモデルを保存します。 2つのフォローアップの質問:モデルがデータの分析を行うのか、それとも受信したものを保存するのか?そして、BTコントローラーはシングルトンでなければならないと思っています(複数のインスタンスが存在することは絶対にありません。常に入ってくる必要があります)。 –

+0

私はBTコントローラがシングルトンであることに同意します。アプリデリゲートの中に1つのインスタンスを単独で作成することは、本当にシングルトンにすることなしには十分です。私は分析コードをどこに置くべきかについてはわかりません。私は少なくともそれをBTコントローラから独立させるだろう。後で生データを再解析してグラフを生成したい場合があります。分析コードを別にすると便利です。 – Yuji

0

あなたのソフトウェアがBTstackのバックグラウンド処理データで連続して動作することになっている場合は、データ処理のためのLaunchDaemonを作成し、設定用の標準アプリケーションを提供することをお勧めします。 (BTstackマウス/キーボード/ GPSはこのアドバイスに従わないが、私はそれらを更新するために周りを回るとき - Celesteは実際のファイル転送のためにデーモンを使用するなど)。

+0

ありがとうございます。今私はこれまでに行ってきました(私たちはbtstackフォーラムで定期的に話していました)。私はbt +解析コードをデーモンに移動することを検討していました。私が電話をかけたり、電話をスリープ状態にしたいときに接続が切断されます。しかし、私の(おそらく素朴な)希望は、Appleが最終的に通常のBTデバイスとBTをSDKの一部として許可するということです。私が実際に受け取って分析するデーモンに行った場合、継続的に生成された処理済みデータをアプリケーションと共有する方法について考えなければなりません(古いデータは簡単です。 –

関連する問題