Как получить массив из NSMutableData - PullRequest
1 голос
/ 08 марта 2012

У меня есть текстовый файл с 5 строками. Мне нужно использовать NSURLConnection, чтобы получить содержимое этого файла. Но NSLog показывает мне, что «дамп» пуст. Как я могу преобразовать данные из NSMutableData в NSArray. Массивы, потому что мне нужно показать эти 5 элементов в 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;

Спасибо заранее. Кстати URL работает, вы можете увидеть файл.

Ответы [ 4 ]

2 голосов
/ 08 марта 2012

Вот как вы реализуете это решение с делегатом:

В вашем .h файле:

@interface MyClass : NSObject <NSURLConnectionDelegate, NSURLConnectionDataDelegate>

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

@end

В вашем .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
1 голос
/ 08 марта 2012

Если вы не хотите использовать делегата, вы можете использовать синхронный вызов с NSURLConnection, например:

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

Просто помните, что это не будет работать асинхронно.Если вы не хотите, чтобы он выполнялся в основном потоке и блокировал ваш основной поток / пользовательский интерфейс, рассмотрите возможность использования отдельного потока для выполнения этого кода или использования GCD.

0 голосов
/ 08 марта 2012

Вам необходимо реализовать методы делегата для NSURLConnection, чтобы получать уведомления о входящих данных. Вы используете асинхронные методы.

Также обратите внимание, что [NSMutableData data] просто создает пустой объект данных .. поэтому вы не можете ожидать, что он будет содержать какие-либо данные ..

Предлагаю вам прочитать https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE (Полностью!)

0 голосов
/ 08 марта 2012

Вы должны использовать делегат, затем сохранить полученные данные в receiveData (который сейчас, конечно, пуст ... вы только что инициализировали его), а затем вы преобразуете данные в строку, как вы делали это в вашем примере , Посмотрите на NSURLConnectionDelegate

...