Как загрузить файлы с Интернета и сохранить в 'Документах' о iPhone?

Сериализация Java является способом сохранить структуры объекта.

Это - лучшая практика для сериализуемого класса для объявления serialVersionUID как private static final long постоянное время компиляции. Это используется, чтобы проверить, что данные объектов и код класса, как утверждают, совместимы.

Итак, почему Eclipse говорит Вам об этом? Вероятно, класс, который Вы расширяете (или потенциально соединяют интерфейсом с Вами, реализует), реализации java.io.Serializable. Это означает, что все подтипы, включая Ваш являются сериализуемыми. Почти наверняка Вы не заботитесь. Необходимо быть в состоянии очистить предупреждения путем применения @SuppressWarnings("serial") на классе или пакете (в package-info.java). Если Вы хотите насильственно предотвратить экземпляры своего сериализируемого класса, то добавьте (из памяти):

private static final java.io.ObjectStreamField[] serialPersistentFields = {
    null
};
private void writeObject(
    java.io.ObjectOutputStream ou
) throws java.io.IOException {
    throw new java.io.NotSerializableException();
}
private void readObject(
    java.io.ObjectInputStream in
) throws java.io.IOException, java.lang.ClassNotFoundException {
    throw new java.io.NotSerializableException();
}
private void readObjectNoData(
) throws java.io.ObjectStreamException {
    throw new java.io.NotSerializableException();
}

Это является, вероятно, не лучшим, продумал систему в мире (хотя это намного лучше, чем многие люди дают ему кредит на).

5
задан RexOnRoids 26 August 2009 в 02:56
поделиться

1 ответ

Самый простой способ - использовать удобные методы NSData initWithContentOfURL: и writeToFile: atomically: для получения данных и их записи, соответственно. Имейте в виду, что это синхронно и блокирует любой поток, в котором вы его выполняете, до завершения выборки и записи.

Например:

// Create and escape the URL for the fetch
NSString *URLString = @"http://example.com/example.png";
NSURL *URL = [NSURL URLWithString:
              [URLString stringByAddingPercentEscapesUsingEncoding:
                          NSASCIIStringEncoding]];

// Do the fetch - blocks!
NSData *imageData = [NSData dataWithContentsOfURL:URL];
if(imageData == nil) {
    // Error - handle appropriately
}

// Do the write
NSString *filePath = [[self documentsDirectory] 
                      stringByAppendingPathComponent:@"image.png"];
[imageData writeToFile:filePath atomically:YES];

Где метод documentsDirectory бессовестно украден из , это question :

- (NSString *)documentsDirectory {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    return [paths objectAtIndex:0];
}

Однако, если вы не собираетесь создавать потоки самостоятельно, это остановит активность пользовательского интерфейса во время загрузки файла. Вместо этого вы можете захотеть изучить NSURLConnection и его делегата - он загружается в фоновом режиме и уведомляет делегата о данных, загружаемых асинхронно, поэтому вы можете создать экземпляр NSMutableData, а затем просто записать его, когда соединение будет установлено. Ваш делегат может содержать такие методы, как:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Append the data to some preexisting @property NSMutableData *dataAccumulator;
    [self.dataAccumulator appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // Do the write
    NSString *filePath = [[self documentsDirectory] 
                          stringByAppendingPathComponent:@"image.png"];
    [imageData writeToFile:filePath atomically:YES];
}

Мелкие детали, такие как объявление dataAccumulator и обработка ошибок, оставлены читателю :)

Важные документы:

13
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: