2012-09-13 9 views
6

Próbuję przeglądać przykłady z innych, jak i Apple. Zgubiłem się.Pisanie własnej metody blokowania

Mam klasę singleton, której używam do obsługi logowania użytkownika (kwestionuje serwer WWW itp.).

Chcę utworzyć blok, do którego mogę zadzwonić, podać nazwę użytkownika/hasło. Blok wykona połączenia z serwisem internetowym, a następnie zwróci je, jeśli się powiedzie, lub nie.

To co już udało się uzyskać pracę do tej pory:

Moja Singleton klasy wygląda następująco:

.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 

I następnie wywołać metodę tak:

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

Moje pytanie jest z trzech części:

  1. Jak mogę napisać o zakończeniu obsługi dla bloku podobnego do UIView animation... bloku.

  2. Czy to dobry pomysł, aby wykonywać te połączenia z usług sieciowych w oparciu o implementację blokową?

  3. powinienem być deklarowania metody bloku tak:

    - (bool)loginUserWithBlock:(AMLoginBlock)block;

zamiast korzystania +(bool)loginUser.. ponieważ jest klasą singleton. Nie jestem pewien, czy spowoduje to utworzenie wielu wystąpień singletonu.

Moim celem jest móc wywoływać ten blok, tak jak nazywasz [UIView animation..]. Więc mogę po prostu zrobić:

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

Odpowiedz

6

Zakończenie Handler

Będziemy chcieli skopiować blok zakończenia do klasy Ivar:

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

Ponieważ zapisywania bloku, trzeba mieć metoda nieklasowa bierze blok (zobacz poniżej, jak to zrobić bez naruszania singleton). Przykładem swojej metody mogą być:

- (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]; 
} 

wtedy, gdy kod logowania zakończy swoją pracę, można wywołać blok - tu mijam siebie.Błąd, o bool do bloku:

- (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; 
} 

dobry pomysł

dobrze, to jest pytanie filozoficzne, ale powiem tak: Bloki w Objective-C pozwala na pisanie kodu, który wykonuje jedno zadanie i łatwo zintegrować go z wieloma programami. Jeśli zdecydujesz się nie używać obsługi zakończenia w kodzie logowania musisz kodu logowania do:

  • Wymagaj że zajęcia korzystali wdrożenie protokołu (jak w LoginDelegate)
  • użytkowania jakiś inny system informowania Twój kod, takich jak Key Value obserwując czy Powiadomienia
  • twardy Kod go tylko pracować z jednym typem wywołania klasa

Każde z powyższych rozwiązań są w porządku, czuję wezwanie z powrotem System bloku oparte jest najprostszym i najbardziej elastyczny. Pozwala on po prostu korzystać z klasy bez martwienia się o dodatkową infrastrukturę (konfigurowanie powiadomień, zgodność z protokołami itp.), Jednocześnie umożliwiając ponowne jej użycie w innych klasach lub programach.

Singelton

Metody, które zaczynają się + w celu C sposoby klasy. Nie możesz używać metod klasowych do manipulowania iVars, jako kto byłby właścicielem tych danych?

Co można zrobić, to mieć metodę klasy, która zawsze zwraca to samo wystąpienie tej klasy, co pozwala na posiadanie obiektu, który może posiadać dane, ale unikaj posiadania więcej niż jednego z nich.

This excellent Stack Overflow answer has sample code.

Powodzenia!