0

私は iOS の初心者であり、iOS アプリでの「良い実践」方法のいくつかを理解しようとしています。

アプリの起動時に呼び出されるコントローラーになるように作成した ViewController があります。その中にviewDidLoadという関数があり、それを変更してユーザーがuser_idを持っているかどうかを確認し、最終的に非同期リクエストを作成してリモートdbでそのユーザーを管理する関数を呼び出そうとしました。これが私のコードです:

- (void)viewDidLoad
{
    [super viewDidLoad];

    EmailUtil *email = [EmailUtil alloc];
    email = [email init];

    // This is just a test call to the function that would make a remote server request
    [email setEmail: @"test" andBody: @"hello"];


    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
    if([standardUserDefaults objectForKey:@"user_id"] == nil)
    {
        NSLog(@"First time"); 

        [standardUserDefaults setBool:YES forKey:@"user_id"];      

    }
    else 
    {
        NSString *subject = @"subject";
        NSString *body = @"bod";

         NSLog(@"Not first time"); 
    }    
}

そのため、ここで私が確信していないことがいくつかあります。関数を呼び出して viewDidLoad からリモート呼び出しを行うという事実が、その関数で問題を引き起こす可能性はありますか? 現在、リモートリクエストを送信していません。

また、この関数の最後で作成したオブジェクトのメモリを解放する必要がありますか?

それとも、このコードをクラス内の別の場所に移動するだけでよいでしょうか。

次のようにメール オブジェクトを呼び出します。

[email setEmail: @"test" andBody: @"hello"];

EmailUtil クラスのコードは次のとおりです。

//
//  EmailUtil.m
//

#import "EmailUtil.h"

@implementation EmailUtil

-(void) setEmail: (NSString *) subject andBody: (NSString *) body
{   
    NSString *final_url = [NSString stringWithFormat:@"http://www.my_url.com?subject=%@&body=%@",subject, body];
    NSURL *url = [NSURL URLWithString:final_url];

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url ];

    // TODO: ok I dont really understand what this is
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {         
         NSLog(@"On return");

         NSLog(@"This is data: %@" , data);
         NSLog(@"This is response: %@" , response);
         NSLog(@"This is error: %@" , error);

         NSLog(@"OK");

     }];    


}
@end

ありがとうございました!

4

2 に答える 2

2

あなたが言った:

そのため、ここで私が確信していないことがいくつかあります。関数を呼び出して viewDidLoad からリモート呼び出しを行うという事実が、その関数で問題を引き起こす可能性はありますか? 現在、リモートリクエストを送信していません。

viewDidLoad で必要な呼び出しを自由に行ってください。UI をブロックするようなことはしないでください (例: 長くて複雑なメソッド)。UI に関連しない長時間実行されるタスクは、別のキューで非同期に実行されますが、それは遠い将来の別の日にします。

これをここで行うか で行うかはapplication:didFinishLaunchingWithOptions:、UI が何をするかによって異なります。その質問に答えるには、アプリのフローをよりよく理解する必要があります。そして、 がどのようにEmailUtil表示されるかを理解する必要があります (多くの場合、これらの種類のクラスはモーダル表示を使用します。これは、 からではなく、別のビュー コントローラーから行うのが理にかなっていますapplication:didFinishLaunchingWithOptions:)。

しかし、結論として、私は個人的application:didFinishLaunchingWithOptions:にアプリの「メイン」または「ホーム」ページになるものにいつも連れて行ってくれました。初めて使用するときに何かを提示したいが、それをメインページにしていない場合は、次に、メインのビュー コントローラーからこれを呼び出しますviewDidLoadapplication:didFinishLaunchingWithOptions:他の人は、「初めて使用する」ロジックでカスタマイズします。それは個人的な好みの問題です。

また、この関数の最後で作成したオブジェクトのメモリを解放する必要がありますか?

メモリ管理の第 1 のルールは、所有しているもの (通常は作成したもの) は常に解放し、所有しているものだけを解放することです。ただし、ARC を使用している場合 (これを使用することを強くお勧めします)、これは自動的に処理されます (オブジェクトはスコープ外になると割り当てが解除されます)。

それとも、このコードをクラス内の別の場所に移動するだけでよいでしょうか。

個人的には、メインのビュー コントローラーが表示されたからといってアプリにメールを送信させることに夢中になっているわけではありません。これは単なる例であり、実際のアプリではないと思います。しかし、これを別の場所に配置することを検討している場合、「メール送信」機能は、走って実行するのではなく、「メール送信」ボタンをタップするユーザーに論理的にフックされます。

その他の点:

  1. ただし、このコードは興味深いものです。なぜならEmailUtil、ローカル var を作成し、そのいくつかのプロパティを設定しているのに、それに対して何もせずに、スコープから外れるままにしているからです。これを機能させるためのメソッドが必要になると思いますEmailUtil。たとえば[email sendMessage]、 、または適切なメソッドが何であれ。

  2. また、2 つのローカル変数 と を作成subjectbodyており、それらを使用せず、範囲外にしています。emailそれに応じてオブジェクトのプロパティを更新したかったと思いますが、それには達していません。

  3. EmailUtilを使用するのではなく、独自のクラスを作成する理由はありますMessageUI.frameworkか? うまくいけばEmailUtil、 の素敵なラッパーになるMessageUI.frameworkか、またはまったく異なることを行いますが、Apple が既に提供している機能を複製するものではありません。

  4. あなたは、アプリが「リモートデータベースでそのユーザーを管理するために非同期リクエストを行う」と言っていました。わお。私は今、そのようなことを常に行っていますが、サーバーとの非同期調整を初めてのプロジェクトとしてはお勧めしません。「最終的に」と言ったのは、「今後 1 週間か 2 週間以内」ではなく、「今から 2 か月後」を意味していることを願っています。基本的なView Controllerとメモリ管理については、まだ海に足を踏み入れているようです。アプリの初期バージョンの機能を少し野心的でないものに制限できるかどうかを確認したい場合があります。まだ基本的なスキルがなく、複雑なことをしようとすると、後で完全に書き直さなければならないほどの混乱に陥る可能性があります。だから、悪意はありません、しかし、最初の実際のプロジェクトでもう少し簡単なものを考え出すことができるかどうかを確認してください. または、最初にいくつかのテスト アプリを実行します。ちょっとした考え。

  5. Lvsti は、典型的なオブジェクト作成構造が[[EmailUtil alloc] init]. あなたが持っているものは同等ですが、非標準です。

  6. 進行中の作業であることは承知していますsetEmail:andBody:が、プロパティを設定してメッセージを送信しているようです。(a) andの@propertyエントリを用意することをお勧めします (これにより、 andメソッドが自動的に生成され、 のようなことができます); (b) 必要に応じて、init 簡易メソッドを用意します。たとえば、subjectbodysetSubjectsetBodyemail.subject = @"This is the subject of the email";initWithSubject:body:これにより、オブジェクトが初期化され、これら 2 つのプロパティが設定されます。(c)実際にメッセージを送信する別のメソッドがあります。セッターのように見え、セッターの一種であるだけでなく、より多くの重要なことをすべて単一のメソッドで行うことは、良い習慣ではありません。「set」という単語で始まるメソッドは一般に標準のセッターであり、iOS の規則により、他のプログラマーがコードを読み違える可能性があります (私が行ったように)。いくつかの標準的な iOS 規則に従うことで、コードのレビューと修正に iOS プログラマーを関与させることが容易になります。

于 2012-07-18T14:07:13.413 に答える
1

このコードを appdelegate の application:didFinishLaunchingWithOptions: メソッドに移動する必要があります。iOS デベロッパー センターから

このメソッドを使用して、アプリケーションを初期化し、実行する準備をする必要があります。アプリケーションが起動され、メインの nib ファイルがロードされた後に呼び出されます。このメソッドが呼び出された時点では、アプリケーションは非アクティブ状態になっています。

また、arc を使用していない場合は、EmailUtil だけを解放する必要があります。手動で割り当てを解除する必要はありません。

于 2012-07-18T14:06:59.823 に答える