Anfänger Verständnis Frage

  • Anfänger Verständnis Frage

    Hallo Profis,

    Anfängerfragen sind lästig - ich weiß.
    Wo soll ich aber fragen, wenn nicht hier bei den Profis?

    Ich habe eine Verständnisfrage.
    Habe in Xcode eine Cocoa Anwendung zum lernen gemacht. Nur Cocoa Anwendung ausgewählt und die nötigen Schritte gemacht.
    Es kommt eine App mit einem Fenster. In dem fenster ist ein View, in den ich einen webview gemacht habe.

    Dazu habe ich ein zweites fenster gemacht, welches über das Menü über ibaction geöffnet wird.

    Keine große Sache. Aber eben mein Lernprojekt.

    Nun habe ich in dem Webview einen loadrequest nsurlrequest, um die benötigte Internetseite im Fenster anzeigen zu lassen.
    Funktioniert alles. Jedoch ist mir aufgefallen, daß, wenn das netz so langsam ist, daß es ca 10 sekunden dauert bis die Seite geladen ist, der "schöne" drehende Ball kommt.
    Dann ist alles blockiert und ich kann nix mehr machen.

    Den Urlrequest habe ich so:

    Quellcode

    1. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    2. {
    3. if ([_vorwahlZuhause state] == NSOffState){
    4. [[_test mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[_unterwegsTextField stringValue]] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:180]];
    5. }
    6. else{
    7. [[_testt mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: [_zuhauseTextField stringValue]] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:180]];
    8. }
    9. }
    Alles anzeigen


    Er arbeitet das natürlich ab, und alles geht (Code oben ist eingekürzt). Aber wie lass ich ihn denn den URL request im "Hintergrund" machen, ohne das der ball kommt und ich in der zwischenzeit nix mehr anderes machen kann?

    Kann mir das jemand in einfachen worten erklären, oder ein Beispiel nenn, wie ich´s anders machen muss?

    Vielen Dank

    Gruß
    Dirk
  • Ja, da bin ich mir ziemlich sicher, daß der ball durch den loadrequest kommt.

    Wie gesagt, wenn das netz schnell ist, geht alles und ich kann in der app auch das zweite fenster aufmachen.
    Nur eben, wenn der loadrequest ausgeführt wird, aber erst in sagen wir 10 sekunden abgeschlossen, hängt alles.

    Wie muss ich das denn anders machen? Oder was soll ich ändern um das zu umgehen?

    Ich habe hier schon gesucht und auch gefunden, daß der request asynchron ist und daher ja keine Probleme machen sollte. Aber richtig verstehen tue ich das eigentlich nicht. Bin eben kein Profi, sondern muss durch lesen, üben und nachfragen mir die sachen zusammenreimen.

    Hast Du einen Vorschlag wie ich das anders machen könnte?

    Danbke und Gruß
    Dirk
  • Habe mich oben vertan. Wir reden ja hier vom Request und nicht von der Connection.

    Aber ich bin gerade verwirrt. Warum machst Du einen Timeout von 180s ? Irgendwie klar das der Request nicht weiterkommt wenn er 3 min auf einen nicht vorhanden server warten soll. Wenn ein Server nach 10s nicht antwortet würde ich einfach mal davon ausgehen das er nicht mit Dir kommunizieren möchte. Aus welchem Grund auch immer. Mach doch einfach mal vor und hinter den Request ein NSLog(@"Test"); dann siehst du wie lange er in dem Request hängt und blockt.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Also so wie ich das verstehe ist nicht das Erzeugen des Request asynchron sondern die Connection die Du danach erzeugst um die Daten abzuholen. Ich wüßte auch nicht wie es sonst gehen sollte das man eine Request erzeugt und direkt danach daraus eine Connection bildet

    developer.apple.com/library/ma…UsingNSURLConnection.html

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • McDan hatte recht. Es ist nicht der loadrequest.

    Ich glaub, ich hab ein anderes Problem. Ich hatte das hier übersehen:
    Aus der Variablen, wo ich oben auch die URL für den loadrequest hole, mach ich aber auch noch folgendes:

    Quellcode

    1. NSString *unterwegsUrlinhalt = [NSString stringWithContentsOfURL:[NSURL URLWithString:[unterwegsUrlString stringByAppendingPathComponent:@"user/text.txt"]] encoding:NSASCIIStringEncoding error:nil];


    Und da ich das nicht auskemmentiert hate, hatte er immer versucht darauf zuzugreifen und kanns nicht.
    Und das ist bestimmt das Problem, oder?
    Das dürfte nicht asynchron sein, richtig?

    Aber wie mach ich das asynchron?

    Oder bin ich mal wieder auf dem Holzweg?

    Puuh, lernen am lebenden Objekt ist nicht einfach, wenn man nicht ständig einen Lehrer neben sich hat, der einem auf die Finger haut.... ;)

    Kann mir jemand sagen, wie ich das oben denn dann asynchron bekomme?

    Danke!!!
  • Super!

    Ob ich das jedoch umgesetzt bekomme, ist ne andere Frage.... :(

    Aber theoretisch hab ich´s schon mal kapiert. Wie ich das nu umsetze, muss ich mal basteln (und bestimmt wieder dran verzweifeln)

    Jedenfalls danke ich euch schon mal für die Geduld! Habt mir wieder was beigebracht und bin deshalb zu dank verpflichtet!

    Gruß
    Dirk
  • Ne, ich schaffs alleine nicht.

    Brainfuck-Quellcode

    1. if (([_vorwahlUnterwegs state] == NSOnState) && ([_triggerHUD state] ==NSOnState))
    2. {
    3. NSURL *hudUrl1 = [NSURL URLWithString:[_unterwegsTextField stringValue]];
    4. NSString *hudUrlString1 = [NSString stringWithFormat:@"%@://%@:%@", [hudUrl1 scheme], [hudUrl1 host], [hudUrl1 port]];
    5. NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:[hudUrlString1 stringByAppendingPathComponent:@"user/text.txt"]]
    6. cachePolicy:NSURLRequestUseProtocolCachePolicy
    7. timeoutInterval:60.0];
    8. NSString *textinhalt = ????????????????????????????????????? <------------------------
    9. NSLog(@"URL mit datei: %@",theRequest);
    10. NSLog(@"Ergebnis: %@",textinhalt);
    11. }
    12. }
    Alles anzeigen


    soweit bin ich gekommen.
    NSLog zeigt mir nun schön den request an der text.txt
    das ist doch dann eine asynchrone abfrage, oder?

    Aber wie komm ich denn nu den Inhalt der text in den NSString *textinhalt rein???

    Oder mach ich das grundsätzlich verkehrt?

    Ich brauch eine asynchrone Abfrage einer datei, die ihren inhalt dann in eine Variable schreibt.

    Oder geht so was nur synchron????

    Ich raff´s net.
  • Das tue ich ja, stoße dann aber wieder auf das nächste Probelm.
    Im Beispiel unter dem Link ist z.B. folgende Zeile:

    receivedData = [[NSMutableData data] retain];

    und die bekomm ich direkt angemeckert mit: ARC forbids eplixit message send of retain

    Und schon gehts für mkch wieder nicht mehr weiter.

    Vielleicht hat ja jemand ein Beispiel mit einer asynchronen Abfrage einer datei deren Inhalt dann in einer Variablen gespeichert wird.
    Ich mach das meist andersrum. ich guck mir Code an und schau dann in die Doku um nachzulesen, was ich nicht verstehe.
    Andersrum macht mir das wirklich noch große Schwierigkeiten.

    Aber trotzdem Danke. Ich fummel mal weiter....
  • Ja, hatte ich hinzugefügt

    Bin dann aber wie oben gesagt am:

    receivedData = [[NSMutableData data] retain];

    und die bekomm ich direkt angemeckert mit: ARC forbids eplixit message send of retain

    gescheitert

    werd heut abend weiterfummeln.

    irgendwie muss ich das ja hinbekommen