i have created a class for downloading music from internet, while i am trying to download the song after the completion of first song download, i got the error
'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array'
my code is here,
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
//[responseData release];
dict=[responseString JSONValue];
//title is NSArray object
title=[dict valueForKey:@"sTitle"];
URLTitle=[[NSMutableArray alloc]init];
[URLTitle addObjectsFromArray:title];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"pslamsSongs.mp3"];
NSLog(@"path %@",documentsDirectoryPath);
[receivedData writeToFile:documentsDirectoryPath atomically:YES];
if (receivedData) {
UIAlertView *alt = [[UIAlertView alloc] initWithTitle:@"Download Completed" message:@"Download Music completed, you can access the music from iTunes" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alt show];
[alt release];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [URLTitle count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
newCell = nil;
newCell = [tableView dequeueReusableCellWithIdentifier:identifier];
if(newCell == nil)
{
NSLog(@"newCell ===================");
NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"downloadPageCell" owner:self options:nil];
newCell = [ nibViews lastObject];
}
newCell.downloadButton.tag=indexPath.row;
[newCell.downloadButton addTarget:self action:@selector(downloadButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
newCell.downloadButton.tag=indexPath.row;
return newCell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
-(void)downloadButtonPressed:(UIButton*)sender
{
UIButton *btn1 = (UIButton *)sender;
//**i got the error in this line**
appendString=[URLTitle objectAtIndex:btn1.tag];
appendString= [appendString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
URL= [staticURL stringByAppendingString:appendString];
NSLog(@"download button pressed");
downloadURL=[[NSURL alloc]initWithString:URL];
theRequest = [NSURLRequest requestWithURL:downloadURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
receivedData = [[NSMutableData alloc] initWithLength:0];
connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];
}
my array become empty when i click the next download after completing the first one, any solution?
Everytime you finished downloading the song, you are allocating a new NSMutableArray, assigning it to URLTitle, and then adding the newly downloaded objects there. It is not the same as adding objects to existing NSMutableArray, hence it becomes empty first every time you download a new song.
Try to just allocate the URLTitle once in the viewDidLoad method:
And leave the
[URLTitle addObjectsFromArray:title];
intact in the connectionDidFinishLoading method.