2014-10-01 14 views
7

Jak napisać funkcję bloku w szybkim tempie. Przeczytałem na ten temat, ale składnia po prostu nie ma dla mnie większego sensu.Zapisywanie funkcji blokowych w Swift

MyAppRequest *request = [_agent login]; 
    [request sendWithLoadMessage:@"Signing In" 
    successMessage:@"Signed In" 
    failureMessage:@"Failed to log in" 
    recoveryOptions:@"If you keep having trouble, try going to http://mystrou.firehosehelp.com and try loggin in there. If that fails, try resetting your password" 
    success:^(MyAppResponse *response) { 
     PREFS.authToken = _agent.accessToken; 
     [_delegate loginViewController:self loggedInAgent:_agent]; 
    } failure:^(MyAppResponse *response) { 

    }]; 
+1

proszę pisać więcej kodu - nie są częściami rozmowy zaginionego. – fluidsonic

+0

Jestem pewien, że odpowiednio zaktualizowałem – YichenBman

Odpowiedz

19

To naprawdę nie jest trudne. zwane zamknięciami w Swift).

public func someFunction(success: (response: AnyObject!) -> Void, failure: (error: NSError?) -> Void) { 

} 

A oto jak go nazwać.

someFunction(success: { (response) -> Void in 
    // Handle success response 
}) { (error?) -> Void in 
    // Do error handling stuff 
} 

W twoim przypadku otrzymuję ten blok obsługuje niektóre odpowiedzi serwera. Najprawdopodobniej logowanie. Blok success zostanie wywołany, jeśli operacja sieci się powiedzie. Wewnątrz tego narzędzia zapisujesz otrzymany token dostępu z serwera.

Blok failure jest wywoływany, jeśli żądanie sieci nie powiedzie się. Być może zechcesz zarejestrować błąd, wyświetlić ostrzeżenie dla takich rzeczy użytkownika, jak w nim.

Jeśli nie masz pewności co do składni, którą sugeruję, odnieś się do tych dwóch stron. Dla Objective-C block syntax i dla Swift closure syntax.

0

dzięki @isuru wyobraziłem to uwagę:

let request: MyAppRequest = agent .login() 

request .sendWithLoadMessage("Signing in", 
     successMessage: "Signed in", 
     failureMessage: "Failed to login", 
     recoveryOptions: "Figuring it out", 
     success: { (response: MyAppResponse!) -> Void in MyAppSettings().authenticatingToken = agent.accessToken 
     }) { (response: MyAppResponse!) -> Void in 
      var alert = UIAlertController(title: "Oops!", message: "You haven't figured out the token thing!", preferredStyle: UIAlertControllerStyle.Alert) 

      alert.addAction(UIAlertAction(title: "Click", style: UIAlertActionStyle.Default, handler: nil)) 
      self.presentViewController(alert, animated: true, completion: nil) 
    } 
Powiązane problemy