Globale Klasse

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Globale Klasse

    Da bin ich mal wieder, weiß nicht ob ich mich zu dumm anstelle, aber ich hab da nen kleines Problem. Und zwar sagen wir mal ich habe eine Klasse Connection in diese schreibe ich alle möglichen Methoden rein die ich in der App brauche um Verbindungen zu einem Server herzustellen usw. Nun hab ich gelesen um auf eine Klasse zugreifen zu können muss man sie ja erst mal initialisieren.
    Also habe ich in einem ViewController1 die Klasse über #import "Conntection.h" eingebunden und bei der Methode viewDidLoad die Klasse initialisiert. Das funktioniert auch wunderbar ich kann somit im ganzen ViewController1 auf die Methoden und gesetzten Variablen der Klasse zugreifen. Aber wenn ich das ganze jetzt auch noch von einem anderen ViewController2 machen will, müsste ich ja da wieder die Klasse über #import einbinden und initialisieren und somit wären ja alle Variablen die ich über den ViewController1 erhalten habe weg, weil er ja eine neue Instanz der Klasse erstellt. Müsste ich dann diese Globale Klasse direkt ins AppDelegate einbauen oder gibt es eine andere Möglichkeit auf die Variablen der Klasse Connection, die ich über den ViewController1 gesetzt habe, zuzugreifen?

    Ich hoffe das klingt nicht zu verwirrend :D
    [window close]
  • Die Frage ist wer erzeugt ViewController 2 ? Wenn er von ViewController 1 erzeugt wird, kannst Du ja einfach die Referenz weitergeben.

    Du kannst auch die Klasse im AppDelegate initialisieren und dann an alle ViewController übergeben.

    Weniger schön ist es wenn sich jeder ViewController die Referenz aus dem AppDelegate rausholt. Geht aber auch.

    Die schlechteste Lösung ist es die Kasse als singleton zu initialisieren.

    Ist halt alles eine Frage wie dein MVC aussieht/aussehen soll.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Hmmm also mal grob gesagt

    ich habe einen TabBarController mit derzeit 4 Tabs, im ersten Tab wird ein BenutzerView dargestellt sofern man eingeloggt ist, falls nicht wird ein LoginView über presentModalView eingeblendet der dann nach erfolgreichem Login wieder über dismissModalView ausgeblendet wird, desweiteren gibt es im LoginView noch einen RegisterView der wiederum auch über ein presentModalView über den LoginView eingeblendet wird.

    Der LoginView ruft die Klasse Connection auf und führt die Login Methode aus und falls diese erfolgreich ist wird der LoginView entfernt. Nun würde ich gern auch im UserView auf die Daten der Connection Klasse zugreifen. Hab das ganze über ASIHTTPRequests gemacht, also brauch ich sozusagen die Cookies die über den LoginView gesetzt werden auch im UserView. Hab es schon mit sessionCookies versucht, aber die sind leer :(

    puh mal gucken ob das irgendwie verständlich ist :D

    PS: warum ist es eigentlich die schlechteste Lösung eine Singleton Klasse zu verwenden wenn es doch sogar in der Apple Doku steht?
    [window close]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von uniique ()

  • Thallius schrieb:

    Du kannst auch die Klasse im AppDelegate initialisieren und dann an alle ViewController übergeben.
    also müsste ich die Klasse im AppDelegate definieren und initialisieren und wenn ich dann von einer anderen Klasse darauf zugreifen will muss ich das über das AppDelegate machen? Und bleiben dann die Variablen, die ich in der Klasse definiert habe Appweit erhalten?

    mal vielleicht zum Veranschauen:

    es gibt die Klasse Connection in dieser sind 2 Methoden deklariert einmal

    Quellcode

    1. - (void)getUser:(NSString *)userName: (NSString *)userPassword;
    und einmal

    Quellcode

    1. - (void)sendPrivateMessage:(NSArray *)userIds:(NSString *)message;
    die erste Methode wird im LoginViewController aufgerufen und dabei werden Cookies gesetzt die ich dann in einem Array loginCookies speichere. Nun wenn der Login erfolgreich war, wird der LoginViewController entfernt und der UserViewController angezeigt. Nun will ich im UserViewController die 2. Methode aus der Klasse Connection aufrufen sendPrivateMessage mit den Cookies die ich vorher in loginCookie gespeichert habe.

    ich hoffe das klingt irgendwie verständlich ;)
    [window close]
  • Also die beiden Methoden werden aufgerufen indem die Parameter für userName und userPassword über 2 Textfelder übergeben werden. Hier mal beide Methoden ganz ausgeschrieben.

    Quellcode

    1. - (void)getUser:(NSString *)userName:(NSString *)userPassword {
    2. NSString *url = @"http://localhost/~uniique/phpBB/ucp.php?mode=login";
    3. self.loginRequest = [[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:url]];
    4. [loginRequest setPostValue:userName forKey:@"username"];
    5. [loginRequest setPostValue:userPassword forKey:@"password"];
    6. [loginRequest setPostValue:@"on" forKey:@"autologin"];
    7. [loginRequest setPostValue:@"Login" forKey:@"login"];
    8. [loginRequest setUseCookiePersistence:NO];
    9. [loginRequest setDelegate:self];
    10. [loginRequest setDidFinishSelector:@selector(requestFinished:)];
    11. [loginRequest setDidFailSelector:@selector(requestFailed:)];
    12. [loginRequest setTimeOutSeconds:2];
    13. [loginRequest setRequestMethod:@"POST"];
    14. [loginRequest startSynchronous];
    15. }
    16. - (void)sendPrivateMessage:(NSArray *)userIds:(NSString *)message
    17. {
    18. NSString *sid = nil;
    19. // getting Unix Time
    20. NSTimeInterval oldTime = [[NSDate date] timeIntervalSince1970];
    21. NSString *nowTime = [[[NSString alloc] initWithFormat:@"%0.0f", oldTime] autorelease];
    22. // fetching every single user in array userIds
    23. //
    24. NSString *toUser = [[[NSString alloc] initWithFormat:@"%i",userIds] autorelease];
    25. NSMutableString *adressList = [[NSMutableString alloc] initWithString:@"address_list[u][]"];
    26. [adressList insertString:toUser atIndex:16];
    27. for (NSHTTPCookie *cookie in self.loginCookie) {
    28. if ([cookie.name hasSuffix:@"_sid"] && ![cookie.value isEqualToString:@"1"]) {
    29. sid = [NSString stringWithString:[cookie value]];
    30. }
    31. }
    32. NSString *url = [@"http://localhost/~uniique/phpBB/ucp.php?i=pm&mode=iphonecompose&action=post&sid="
    33. stringByAppendingString: sid];
    34. self.request1 = [[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:url]];
    35. [request1 setPostValue:@"" forKey:@"username_list"];
    36. [request1 setPostValue:@"iPhone Message" forKey:@"subject"];
    37. [request1 setPostValue:message forKey:@"message"];
    38. [request1 setPostValue:@"to" forKey:adressList];
    39. [request1 setPostValue:nowTime forKey:@"lastclick"];
    40. [request1 setPostValue:@"0" forKey:@"status_switch"];
    41. [request1 setPostValue:@"Submit" forKey:@"post"];
    42. [request1 setUseCookiePersistence:NO];
    43. [request1 setRequestCookies:[ASIHTTPRequest sessionCookies]];
    44. [request1 setDelegate:self];
    45. [request1 setDidFinishSelector:@selector(requestFinished:)];
    46. [request1 setDidFailSelector:@selector(requestFailed:)];
    47. [request1 setTimeOutSeconds:2];
    48. [request1 setRequestMethod:@"POST"];
    49. [request1 startSynchronous];
    50. }
    Alles anzeigen


    die erste Methode gibt ja einen Cookie zurück, den ich dann bei der zweiten Methode benutzen kann um zu verifizieren, dass der Benutzer der eine PM schreiben will auch wirklich eingeloggt ist. Und halt diese ganzen Sachen mit einloggen, PM schreiben, registrieren usw. wollte ich halt alles in eine Klasse packen die dann von jeder anderen Klasse aufgerufen werden kann. Und die Cookies die ich von der ersten Methode zurückbekomme wollte ich dabei halt irgendwie global speichern. Weil sobald ich die Klasse ja zB initialisiere über den LoginViewController funktioniert das ganze auch, aber der LoginViewController wird ja entfernt sobald man sich neu einloggt und somit hatte ich dann keinen Zugriff mehr auf die globale Klasse ausser wenn ich sie neu initialisiere, dann sind aber alle gesetzten Variablen auch wieder weg, die ich vorher über den LoginViewController durch die Methodenaufrufe gesetzt habe.
    [window close]