Comment obtenir un tableau de Nsmutabledata
-
09-12-2019 - |
Question
J'ai un fichier texte avec 5 chaînes.Je dois utiliser NsurlConnection pour obtenir le contenu de ce fichier.Mais Nslog me montre que "Dump" est vide.Comment puis-je transformer les données de Nsmutabledata vers Nsarray.Les matrices sont parce que je dois montrer ces 5 articles dans une vue de table.
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;
Merci d'avance.BTW URL fonctionne, vous pouvez voir le fichier.
La solution
Si vous ne voulez pas utiliser de délégué, vous pouvez utiliser un appel synchrone avec NsurlConnection, comme celui-ci:
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;
}
Attention à ce que cela ne fonctionnera pas de manière asynchrone.Si vous ne voulez pas qu'il soit exécuté sur le fil principal et bloquez votre fil principal / interface utilisateur, envisagez d'utiliser un thread séparé pour exécuter ce code ou utilisez GCD.
Autres conseils
Voici comment vous implémentez cette solution avec un délégué:
dans votre fichier .h:
@interface MyClass : NSObject <NSURLConnectionDelegate, NSURLConnectionDataDelegate>
@property (nonatomic, retain) NSMutableData *receivedData;
@property (nonatomic, retain) NSArray *namesArray;
@end
en vous. Mode .m:
@implementation MyClass
@synthesize receivedData = _receivedData;
@synthesize namesArray = _namesArray;
- (id)init {
self = [super init];
if (self) {
self.receivedData = [NSMutableData data];
NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://dl.dropbox.com/u/25105800/names.txt"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
[connection start];
}
return self;
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"Received response! %@", response);
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.receivedData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *dump = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding];
NSLog(@"data: %@", dump);
self.namesArray = [dump componentsSeparatedByString:@"\n"];
}
@end
Vous devez utiliser le délégué, puis enregistrer les données reçues dans ReveedData (ce qui est bien sûr vide maintenant. Vous venez de l'initaliser.) Et ensuite, vous transformez les données en une chaîne, comme vous l'avez fait dans votre exemple..Jetez un coup d'œil à NSURLConnectionDelegate
Vous devez mettre en œuvre les méthodes de délégation pour NsurlConnection à notifier des données entrantes.Vous utilisez les méthodes asynchrones.
Notez également que [NSMutableData data]
crée simplement un objet de données vide. Vous ne pouvez donc pas vous attendre à contenir de données.
Je vous suggère de lire https://developer.apple.com/library/ios/#documentation/cocoa/conceptuelle/urlloadingsystem/tasks/ustnsurlconnection.html#/apple_ref/doc/uid/20001836-bajeaeee (complètement!)