To make sure the operation has finished before making any call to code, you can make use the success block of the AFJSONRequestOperation, which is what you have been doing when you adding the objects to the streamUrls:
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSONSound) {
NSString *stringURL = [NSString stringWithFormat:@"%@",
JSONSound[@"stream_url"], nil];
NSURL *streamURL = [NSURL URLWithString:stringURL];
NSLog(stringURL);
[streamUrls addObject:streamURL];
[self.collectionView reloadData];
NSLog([streamUrls objectAtIndex:0]);
} failure:nil];
The reloadData does not affect the data source. It is just refreshing the collection view displayed based on the data source (whether the data source is updated or not).