Search code examples
objective-ciosnsarraynsmutabledata

How to get an array from NSMutableData


I have text file with 5 strings. I need to use NSURLConnection to get contnent of this file. But NSLog shows me, that 'dump' is empty. How can I transform the data from NSMutableData to NSArray. Arrays is because I need to show those 5 items in a TableView.

NSURLRequest *theRequest=[NSURLRequest
                         requestWithURL:[NSURL URLWithString:@"http://dl.dropbox.com/u/25105800/names.txt"]
                         cachePolicy:NSURLRequestUseProtocolCachePolicy
                         timeoutInterval:60.0];

NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    receivedData = [NSMutableData data];
    NSString *dump = [[NSString alloc] initWithData:receivedData
                         encoding:NSUTF8StringEncoding];
    NSLog(@"data: %@", dump);
    NSArray *outputArray=[dump componentsSeparatedByString:@"\n"];
    self.namesArray = outputArray;

Thanks in advance. BTW URL works, you can see the file.


Solution

  • If you don't want to use a delegate, you can use a synchronous call with NSURLConnection, like this:

    NSURLRequest *theRequest=[NSURLRequest
                         requestWithURL:[NSURL URLWithString:@"http://dl.dropbox.com/u/25105800/names.txt"]
                         cachePolicy:NSURLRequestUseProtocolCachePolicy
                         timeoutInterval:60.0];
    
    NSError *error = nil;
    NSHTTPURLResponse *response = nil;
    NSData *receivedData = [NSURLConnection sendSynchronousRequest:theRequest response:&response error:&error];
    
    if (error == nil) {
        NSString *dump = [[NSString alloc] initWithData:receivedData
                         encoding:NSUTF8StringEncoding];
        NSLog(@"data: %@", dump);
        NSArray *outputArray=[dump componentsSeparatedByString:@"\n"];
        self.namesArray = outputArray;
    }
    

    Just beware that this will not be running asynchronously. If you don't want it to run on the main thread and block your main thread/UI, consider using a separate thread to execute that code or use GCD.