Upload and download data from server with Cocoa To

2019-09-05 14:52发布

How can I upload/download data from a server in Cocoa Touch. Here's what I have so far...

-(void)uploadSchedule:(id)sender
{
    NSData *content = [NSData dataWithContentsOfFile:self.dataFilePath];
    NSString *stuff = [[NSString alloc] initWithData:content encoding:NSASCIIStringEncoding];

    NSURL *url = [NSURL URLWithString:@"http://thetis.lunarmania.com"];
    NSMutableURLRequest* urlRequest = [[NSMutableURLRequest alloc]initWithURL:url];
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest setHTTPBody:[stuff dataUsingEncoding:NSASCIIStringEncoding]];

    NSLog(@"great success!");
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // this method is called when the server has determined that it
    // has enough information to create the NSURLResponse

    // it can be called multiple times, for example in the case of a
    // redirect, so each time we reset the data.
    // receivedData is declared as a method instance elsewhere

    [receivedData setLength:0];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // append the new data to the receivedData
    // receivedData is declared as a method instance elsewhere

    [receivedData appendData:data];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    // release the connection, and the data object
    [connection release];
    // receivedData is declared as a method instance elsewhere
    [receivedData release];

    // inform the user
    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // do something with the data
    UIImage *image = [[UIImage alloc] initWithData:receivedData];
    [cat setImage:image];
    [image release];

    // receivedData is declared as a method instance elsewhere
    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);

    // release the connection, and the data object
    [connection release];
    [receivedData release];
}

-(void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge previousFailureCount] == 0) {
        NSURLCredential *newCredential;
        newCredential=[NSURLCredential credentialWithUser:@"ican@moeyo.org"
                                                 password:@"icanican"
                                              persistence:NSURLCredentialPersistenceNone];
        [[challenge sender] useCredential:newCredential
               forAuthenticationChallenge:challenge];
    } else {
        [[challenge sender] cancelAuthenticationChallenge:challenge];
        // inform the user that the user name and password
        // in the preferences are incorrect
        //[self showPreferencesCredentialsAreIncorrectPanel:self];
    }
}

I'm so lost...

3条回答
▲ chillily
2楼-- · 2019-09-05 15:00

And if your file is big, you should better use NSFilehandle, to write data inside didReceiveData, instead of appending.

查看更多
地球回转人心会变
3楼-- · 2019-09-05 15:15

The code crashes because you over-release connection. Review the Cocoa memory management rules.

Aside from that, you'll have to be more specific about what problem you're having with it.

BTW, the term is “instance variable”, not “method instance”. An instance variable is a variable inside of an instance, and has nothing to do with methods.

查看更多
神经病院院长
4楼-- · 2019-09-05 15:19

This has been covered here:

NSURLRequest - encode url for NSURLRequest POST Body (iPhone objective-C)

The accepted answer uses ASIHTTPRequest which is similar to one I've used, and makes it really easy to post/get from an HTML form. Here's an example (from past stackoverflow)

ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:@"http://someSite.com"] autorelease];
[request setPostValue:@"myValue1" forKey:@"myFormField1"];
[request setPostValue:@"myValue2" forKey:@"myFormField2"];
// etc.
[request start];
NSError *error = [request error];
if (!error)
  NSString *response = [request responseString];
查看更多
登录 后发表回答