Pergunta

Eu tenho um arquivo de texto com 5 strings.Preciso usar NSURLConnection para obter o conteúdo deste arquivo.Mas o NSLog me mostra que esse 'despejo' está vazio.Como posso transformar os dados de NSMutableData em NSArray.Arrays é porque preciso mostrar esses 5 itens em um 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;

Desde já, obrigado.BTW URL funciona, você pode ver o arquivo.

Foi útil?

Solução

Se não quiser usar um delegado, você pode usar uma chamada síncrona com NSURLConnection, assim:

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;
}

Apenas tome cuidado para que isso não seja executado de forma assíncrona.Se você não deseja que ele seja executado no thread principal e bloqueie seu thread/IU principal, considere usar um thread separado para executar esse código ou usar o GCD.

Outras dicas

Veja como você implementa esta solução com um delegado:

No seu arquivo .h:

@interface MyClass : NSObject <NSURLConnectionDelegate, NSURLConnectionDataDelegate>

@property (nonatomic, retain) NSMutableData *receivedData;
@property (nonatomic, retain) NSArray *namesArray;

@end

No seu arquivo .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

Você tem que usar o delegado e, em seguida, salvar os dados recebidos em recebidosData (que, obviamente, está vazio no momento).você acabou de inicializá-lo.) e então transforma os dados em uma string, como fez no seu exemplo.Dê uma olhada em NSURLConnectionDelegate

Você precisa implementar os métodos delegados para que NSURLConnection seja notificado sobre dados recebidos.Você está usando os métodos assíncronos.

Observe também que [NSMutableData data] apenas cria um objeto de dados vazio.então você não pode esperar que contenha quaisquer dados.

Eu sugiro que você leia https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE(completamente!)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top