問題タブ [cocoa-design-patterns]
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 - MVCパターン:フォーマット/処理タイプの作業はどこに属しますか?(Objective-C)
Cocoaのスキルが徐々に向上するにつれて、以前の仮定によって構築された穴に戻ったときに、早い段階で行ったようにMVCを乱用しないようにしています。私はここにこれを跳ね返す人がいないので、あなたの一人が助けてくれることを願っています...
多数のさまざまなプロパティ(NSString、NSDate、NSNumberなど)を持つカスタムModelクラスがあります。送信用にプロパティをシリアル化する必要があります。このデータがシリアル化のために処理されているときに、ユーザーが応答する必要があるという質問が表示される場合があります(UIAlertViewなど)。
このコードはどこに属しているのでしょうか。
- 私の一部は、ある意味でデータの永続性に関するものであるため、モデルと言います。
- モデルに含まれるコアデータ(しゃれは意図されていません)の別の解釈であるため、私の一部はビューと言います。また、データが処理されるときに、ユーザーはダイアログを操作する必要があります
- モデルとビューの間のデータの変換を管理しているので、私の一部はコントローラーと言います。
3つすべての組み合わせですか?もしそうなら、データが処理されているときにクラス間の通信はどのように処理されますか?NSNotifications?直接メソッド呼び出し?
cocoa - 複数ウィンドウ/NIB ココア アプリケーションの問題
Cocoa アプリに問題があります。アプリ デリゲートをコントローラーとして使用し、NIB ファイルで 1 つのウィンドウを開きます。ツールバーのボタンをクリックすると、別の NIB から別のウィンドウが開きます。この 2 番目のウィンドウで [保存] をクリックすると、アプリのデリゲート/コントローラーのメソッドが呼び出されます。これはすべて正常に機能します。
奇妙なことに、ツールバー ボタンをクリックするとアプリ デリゲートが 1 つのメモリ ロケーションを指し、2 つ目のウィンドウで [保存] をクリックすると別のメモリ ロケーションを指していることがわからないのです。まるで 2 番目のアプリ デリゲート/コントローラーが作成されているかのようですが、コードをステップ実行しても、それが発生したことを示す兆候はありません。
このタイプのアプリケーションを設計するためのより良い方法はありますか? どこが間違っているのか分かりますか?
iphone - Core Data パターン: ネットワークからの変更でローカル情報を効率的に更新する方法は?
アプリに非効率性があり、それを理解して修正したいと考えています。
私のアルゴリズムは次のとおりです。
スキーマの一部である関連オブジェクトのキーを使用して述語クエリを作成することにより、A 行と B 行をチェックしています。A (常に) と B (実行がその部分に分岐した場合) の両方が、次のような SQL 選択を生成することがわかります。
クエリの 0.0071 秒は 3GS デバイスでは問題ありませんが、これらを 100 追加すると、700 ミリ秒のブロッカーが得られます。
私のコードでは、これらのフェッチを行うためにヘルパーを使用しています。
これは間違っていると思うので、別の方法でチェックを行う必要があります。データベースに一度だけヒットし、その後はメモリから取得する必要がありますよね? (SQL は、確実にローカルに存在し、以前のクエリでメモリにロードされているはずのオブジェクトに対しても実行されます。) しかし、外部ソースからの myObjectId しか持っていない場合、これは私が考えることができる最高のものです。
したがって、おそらく問題は、myObjectId (MyObject の Core Data int64 プロパティ) がある場合、関連するローカル オブジェクトが CD ストアに存在するかどうかを正しく確認するにはどうすればよいでしょうか? 可能な一致のセット全体をプリロードしてから、ローカル配列を述語しますか?
(考えられる解決策の 1 つは、これをバックグラウンド スレッドに移動することです。スレッドから変更を取得して [moc mergeChangesFromContextDidSaveNotification:aNotification]; を実行する場合を除いて、これは問題ありません (通知によってバックグラウンド スレッドから変更されたオブジェクトを取得する)、これはそれでもブロックします。)
iphone - Cocoaの2つのコントローラー間で1つのオブジェクトを同期します
MainControllerがあり、オブジェクト(たとえば、ポリゴン)、コントローラー(たとえば、polygonViewController)を作成します。PolygonViewControllerには2つのアウトレットがあります。
PolygonおよびPolygonViewController.xibファイルを仲介します。
PolygonViewControllerのaPolygonがmainControllerで作成されたポリゴンと同じ(インスタンス)であることを確認するにはどうすればよいですか?
@property Polygon* aPolygon;
PolygonViewControllerに追加しようとしましたが、MainControllerで追加しましpolygonViewController.aPolygon = polygon;
たが、PolygonViewControllerawakeFromNibメソッドのaPolygonは常にnullです。
iphone - ObjectiveC-objectForKeyの問題
さて、私は自分のアプリにハイスコア関数を書き込もうとしています。
私の問題は、ハイスコアがまだ保存されていないときに、プログラムがクラッシュすることです。
私がそれを保存する場合:
まず、正常に動作します。ただし、プログラムを初めて起動して、次のコードでハイスコアを表示しようとすると、次のようになります。
悪いことが起こります。
基本的に、firstNameの下にまだ何も存在しないかどうかを確認するために離れていますか?すでに存在している可能性のある名前を消去せずに初期化する方法はありますか?
ありがとう。
objective-c - 「データのみ」のObjective-Cオブジェクトのより良い代替手段?
私はこのようなデザインの選択に頻繁に遭遇し、少し苦労します。私は他のいくつかの視点を探しています。
私はしばしば、基本的に単なる値のセットである状態のリストを保持したり、状態のチャンクを渡したりしたいと思います。値はプリミティブ型になる傾向があります:float、NSTimeIntervals、CGPointsなど。
私の最初の傾向は、これらのプロパティのセットに対してC構造体を作成することです。
等
しかし、C構造体はネイティブのCocoaコレクションクラス(NSArray
、、 )NSSet
とNSDictionary
うまく連携せず、それらの多くを使用して多くの状態を追跡すると、Cocoaに適した残りのコードの粒子に反するように感じます。構造体の配列を直接管理し、メッセージなどで構造体ポインタを渡します。
一方、生のパフォーマンスは必ずしも重要ではないため、これらの値をNSDictionaryにエンコードして、すべてをNSValue
またはNSNumber
でラップすることはできますが、結果の構文はほとんど簡潔ではなく、少し壊れやすく、実行時に型と名前の正確さが要求されます。挿入とルックアップの両方:
また、NSTimeIntervalなどの一部のタイプは、一部の(議論の余地のある)ハッカーでのみ使用できます(この場合は2倍に型キャストされます)。
最後に、プライベートメンバーデータとゲッター/セッターのみを使用して、データのみのコンテナーオブジェクトを作成できました。(これらはJavaでは「beans」と呼ばれます。)これらは辞書よりもアクセスが簡単で、構造体よりもCocoaですが、特に状態管理に使用される「内部クラス」としてのみ必要な場合は、やり過ぎのように感じます。単一のオブジェクトタイプの内部。
ココアプログラミングの大衆であるあなたはどうやってこれをしますか?
cocoa - CocoaドキュメントベースのアプリケーションのMVC
現在、アプリケーションのリファクタリングと再編成を行っています。モデルとビューの間の分離の一部と、それらのコントローラーが減少していることに気づきました。クリーンアップを行いたいと思います。
私のアプリでは、NSPersistentDocument、NSWindowController、およびモデルクラスといういくつかの主要なクラスを使用しています。
NSPersistentDocumentクラスは、「モデルコントローラー」として機能します。モデルクラスのインスタンスを所有し、モデルとのすべての相互作用を管理します。
NSWindowControllerクラスは、「ビューコントローラ」として機能します。メインウィンドウを所有し、メインウィンドウ内のビューの相互作用を管理します。このクラスは、ウィンドウが定義されているnibファイルのファイルの所有者でもあります。
ここで私が見ている問題は、私が本当の「コントローラー」を持っていないということです。私の現在の設計では、モデルコントローラーとビューコントローラーがお互いを認識している必要があります。2つの間に瞑想オブジェクトがないため、モデルとビューが明確に分離されておらず、複数のビューまたはモデルをサポートすることが問題になります。
既存の両方のコントローラーから、モデルコントローラーとビューコントローラーの間のコントローラーとして機能する新しい「コントローラー」クラスに機能を移動したいと思います。結局のところ、これはまだMVCデザインパターンであり、構造が少し増えています。
ただし、これがCocoaのドキュメントベースのアプリアーキテクチャにどのように適合するかを理解するのは困難です。
私が持っている最大の質問は、この新しいコントローラーオブジェクトをどこでどのように作成するかです。これはCocoaのアーキテクチャにどのように適合しますか?私はCocoaのアーキテクチャと戦っていますか?これを行うためのより良い方法はありますか?
ありがとう。
iphone - iphoneグローバル設定 - それを実装する最良の方法は?
アプリのどこからでもアクセスできるいくつかの設定が必要です。これを実装する最良の方法はありますか?現在、アプリのデリゲートにプロパティを貼り付けているだけで、次のようにアクセスします。
objective-c - これは良い (Cocoa に似た、Apple が承認した) モデル クラスですか?
私はしばらくの間 Objective-C を使用してきましたが、Apple のガイドラインにはあまり従いませんでした。最近、私はCocoa Design PatternsとModel Object Implementation Guideを読み、非常に単純なことをいくつかやろうとしていますが、うまくやっています。
主要な概念を見逃していませんか? 言及しないでくださいself = [super init]
; それはすでにSOで何度も取り上げられています。ただし、私のものを自由に批評して#pragma mark
ください!
(編集:これまでに提案された変更を行い、理由を知る必要がある場合に備えて、どの回答がそれらについて議論しているかをコメントしました。)
iphone - Cocoa でモデル オブジェクトの階層をインスタンス化するときにメモリ フットプリントを削減するにはどうすればよいですか?
NSObject
モデルを表す基本的なサブクラスを使用して、iPhone 用のクイズ アプリケーションを作成しています。実行時に、さまざまなコントローラーがモデル クラスをインスタンス化し、ディスク上の plist から読み取ったデータをモデル クラスに入力します。
モデル クラスは、多肢選択式クイズの基本的な階層を表します。
- 1つのアプリケーションに多くのクイズがあります
- 1つのクイズには多くの質問があります
- 1つの質問には多くの答えがあります
現在、QuizController
クラスがそのQuiz
オブジェクトをロードすると、そのquestions
NSArray
プロパティにQuestion
インスタンスが設定さQuestion
れ、これらの各インスタンスが初期化されると、それぞれが独自NSArray
のAnswer
インスタンスを初期化します。
クイズをロードするときにメモリ内のすべての問題が必要ではないことを認識しています。Quiz
インスタンスのquestions
配列内の特定のインデックスにある問題のみが必要です。
ある種の dataSource プロトコルまたは遅延読み込みパターンが、このシステムで特定のクイズを読み込むときに発生するメモリ フットプリントを削減するのに役立つと考えていますが、どちらを実装するかはわかりません。コミュニティからの次のような提案をいただければ幸いです。
ここで使用するのに適したパターンはどれですか? 短いコード スニペットも、実装方法を理解するのに非常に役立ちます。