2012-09-13 9 views
6

私は他の人やアップルの例を辿っています。道に迷いました。自分のブロックメソッドを書く

私はユーザーのログインを処理するために使用するシングルトンクラスを持っています(Webサーバーなどに挑戦します)。

私はブロックを作成したいと思います。ユーザー名/パスワードを渡してください。ブロックはWebサービスコールを実行し、成功したかどうかを返します。

これは私がこれまでに取り組んで取得する管理してきたものである:

の.h

typedef void (^AMLoginBlock)(NSString *userName, NSString *password); 

@interface AuthManager : NSObject 
+ (id)sharedManager; 

+ (bool)loginUserWithBlock:(AMLoginBlock)block; 

@end 

.M

私のシングルトンクラスは、このようになります

@implementation AuthManager 

+ (id)sharedManager 
{ 
    static dispatch_once_t pred = 0; 
    __strong static id _sharedObject = nil; 
    dispatch_once(&pred, ^{ 
     _sharedObject = [[self alloc] init]; // or some other init method 
    }); 
    return _sharedObject; 
} 

+ (bool)loginUserWithBlock:(AMLoginBlock)block { 
    NSLog(@"im printing from AM"); 
    return true; 
} 

@end 

私は、そうのようなメソッドを呼び出します。私はUIView animation...ブロックと同様のブロックのために完了ハンドラを作成するにはどうすればよい

  1. bool rtn = [AuthManager loginUserWithBlock:^(NSString *userName, NSString *password) { 
         NSLog(@"im here in the block LVC."); 
        }]; 
    

    私の質問は、3つの部分です。

  2. これらのWebサービスコールをブロックベースの実装から実行することをお勧めしますか?それはシングルトンクラスであるため

    - (bool)loginUserWithBlock:(AMLoginBlock)block;

代わりに+(bool)loginUser..を使用して:

  • 私はそうのようなブロック法を宣言すべきです。シングルトンの複数のインスタンスが作成されるかどうかは不明です。

    私の目標は、[UIView animation..]のようにこのブロックを呼び出すことです。だから私は単純に行うことができます。

    @property (nonatomic, copy) void (^completionHandler)(bool *); 
    

    あなたがブロックを保存しているので、あなたが持っている必要があります:あなたはクラスIVARに完了ブロックをコピーしたいと思うでしょう

    [AuthManager loginUserWithUsername:foo 
              password:bar1 
             completion:^(BOOL finished) { 
              if (finished) 
               //push new view controller. 
              else 
               //spit out error 
            }]; 
    
  • 答えて

    6

    完了ハンドラ

    は、非クラスメソッドがブロックを取得します(シングルトンに違反することなくこれを行う方法は以下を参照してください)。あなたの方法の一例は次のようになります。ログインコードは、その作業を終了したとき

    - (void)loginUserWithUsername:(NSString *)username 
            password:(NSString *)password 
            completion:(void(^)(bool *finished))completionBlock 
    { 
        // Copy the blocks to use later 
        self.completionHandler = completionBlock; 
    
        // Run code 
        [self doOtherThings]; 
    } 
    

    その後、あなたはブロックを呼び出すことができます - ここで私は自己を渡します。エラーは、ブロックへbool

    - (void)finishThingsUp 
    { 
        // We are done with all that hard work. Lets call the block! 
        self.completionHandler(self.error); 
    
        // Clean up the blocks 
        self.completionHandler = nil; 
    } 
    

    良いアイデア

    まあ、これは哲学的な質問ですが、私はこれを言うだろう:Objective-Cの内のブロックを使用すると、単一のタスクを実行するコードを書くことができますそれを多くのプログラムに簡単に統合できます。 (LoginDelegateのように)プロトコルを実装し、それを使用して、クラス

  • を知らせるいくつかの他のシステムを使用する必要が

    • :あなたはログインコードで完了ハンドラを使用しないことを選択した場合、あなたはにログインコードが必要になりますそのようなキー値が観測または通知のみへ
    • ハードコードがクラスを呼び出す一つのタイプで動作するようにあなたのコードは

    上記のアプローチのいずれもが、大丈夫です、私はブロックベースのコールバックシステムが最も簡単であると感じ最も柔軟性があります。追加のインフラストラクチャ(通知の設定、プロトコルの準拠など)を気にせずにクラスを使用するだけで、他のクラスやプログラムで再利用できるようになります。

    Singelton Objective-Cで+で始まる

    メソッドは、クラスメソッドです。 iVarsの操作にクラスメソッドを使用することはできません。誰がそのデータを所有するのでしょうか?

    あなたができることは、そのクラスの同じインスタンスを常に返すクラスメソッドを持たせることです。データを所有できるオブジェクトを持つことができますが、複数のオブジェクトを持つことは避けてください。

    This excellent Stack Overflow answer has sample code

    Good Luck!

  • 関連する問題