Чтение из несохраненного списка - PullRequest
0 голосов
/ 09 марта 2011

Я разрабатываю приложение, которое получает свои данные из списка, расположенного на моем веб-сервере. Поэтому приложение зависит от сетевого подключения. Я хочу, чтобы пользователь мог использовать мое приложение в автономном режиме, и поэтому я сохраняю копию plist на устройстве пользователя каждый раз, когда приложение загружается с сетевым подключением. Оттуда я читаю данные из списка, расположенного на устройстве.

Хотя у меня проблемы. Я начинаю загрузку данных в didFinishLaunchingWithOptions методе AppDelegate. Это делается так:

if(hasConnection) { // returns TRUE or FALSE based on Apple's example on checking network reachability
        NSLog(@"Starting download of data.");

        // loading using NSURLConnection
        NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:FETCH_URL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

        // create the connection with the request
        // and start loading the data
        NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
        if (theConnection) {
            // Create the NSMutableData to hold the received data.
            // receivedData is an instance variable declared elsewhere.
            receivedData = [[NSMutableData data] retain];
        }
    }

Затем я добавляю данные в мой список Bands.plist в connectionDidFinishLoading

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // throw data into a property list (plist)
    NSMutableArray *tmpArray = [NSPropertyListSerialization propertyListFromData:receivedData mutabilityOption:NSPropertyListMutableContainers format:nil errorDescription:nil];

    NSMutableArray *plistArray = [[NSMutableArray alloc] initWithArray:tmpArray];

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

    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Bands.plist"];

    [plistArray writeToFile:path atomically:YES];
    [plistArray release];

    // release the connection, and the data object
    [connection release];
    [receivedData release];
}

Но при первой загрузке приложения происходит сбой. Я считаю, что это связано с тем, что приложение пытается получить эти данные, даже если они еще не сохранены. Если я удалю часть, которая пытается получить данные, сохраненные локально, у меня нет проблем. У меня также нет проблем, если я добавлю его снова и перезапущу приложение (вторая загрузка).

У кого-нибудь есть идеи, как решить эту проблему?

Как будто мое приложение пытается загрузить и обработать данные, которые еще не существуют.

1 Ответ

0 голосов
/ 10 марта 2011

Просто попробуйте сначала проверить наличие plist:

if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
   ...  // read the data, etc.
}
else {
   ...  // don't try to read it
}

Приветствия
Sascha

...