Frage

Ich habe eine solche Methode. Es funktioniert gut, wenn mein Gerät über das WLAN -Netzwerk verbunden ist, aber wenn es über 3G -Netzwerk verbunden ist, friert es meine App einige Sekunden ein. Da es sich also um eine interaktive App handelt, muss sie bei einigen verschiedenen Postanforderungen fortgesetzt werden, damit der Benutzer die App weiterhin verwenden kann. Irgendeine Lösung dafür?

Ich habe versucht, das [anspruchsvolle setTimeoutInterval: 2.0] zu reduzieren. Aber das hat mein Problem nicht behoben.

// post request
    - (void)postRequestWithURL:(NSString *)url 
                                body:(NSString *)body 
                         contentType:(NSString *)contentType 
                             options:(NSDictionary *)dict
    {
        // set request
        NSURL *requestURL = [NSURL URLWithString:url];
        NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc] init];


        if([dict count] > 0)
        {
            for (id key in dict) {
                NSLog(@"[theRequest addValue:%@ forHTTPHeaderField:%@]", [dict valueForKey:key], key);
                [theRequest addValue:[dict valueForKey:key] forHTTPHeaderField:key];
            }
        }

        if (contentType != nil) {
            [theRequest addValue:contentType forHTTPHeaderField:@"Content-type"];
        }

        [theRequest setURL:requestURL];
        [theRequest setTimeoutInterval:2.0];
        [theRequest setHTTPMethod:@"POST"];
        [theRequest setHTTPBody:[body dataUsingEncoding:NSASCIIStringEncoding]];
        [self.oauthAuthentication authorizeRequest:theRequest];
        // make request
        //responseData = [NSURLConnection sendSynchronousRequest:theRequest 
        //                                   returningResponse:&response 
        //                                               error:&error]; 

        NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];
        self.web = conn;

        [conn release];

        NSLog(@"########## REQUEST URL: %@", url);




        // request and response sending and returning objects
    }
War es hilfreich?

Lösung

Es friert Ihre App ein, weil Sie es gesagt haben. Sie sind sofort in Start gegessen. Dies bedeutet, dass die Verbindung in diesem Thread startet und wartet, bis sie fertig ist. Ich denke, der Thread, auf dem Sie dies tun, ist der Hauptfaden - derjenige, der auch die Benutzeroberfläche usw. behandelt :)

Sie müssen so etwas verwenden connectionWithRequest:delegate: - Dadurch wird die Anfrage im Hintergrund ausgeführt und Ihnen mitgeteilt, wann sie fertig ist.

PS Der Grund, warum Sie den Fehler in WLAN nicht festgestellt haben, liegt daran, dass die Daten so schnell gesendet wurden, dass Sie die Pause in Ihrer App nicht bemerken konnten :)

PPS Der Grund, warum das Timeout nicht behoben wurde, liegt daran, dass die Anfrage nicht zeitlich ausgeführt wurde - sie wurde nur sehr langsam Daten :)


BEARBEITEN

Etwas wie das :

self.web = [NSURLConnection connectionWithRequest:request delegate:self];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top