Тип UIAlertView противоречит UIActivityIndicator

Я загружаю изображения из онлайн-изображения для кеширования в автономном режиме. Когда я открываю приложение, изображение было загружено полностью до появления UIAlertView. Неправильно закончено. Я хочу сделать всплывающий UIAlertView перед загрузкой изображений. Вот мой код ниже.

- (void) operatePopupUpdating {
    myAlert = [[UIAlertView alloc] initWithTitle:@"Updating database.." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil];
    [myAlert show];

    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

    indicator.center = CGPointMake(myAlert.bounds.size.width / 2, myAlert.bounds.size.height - 50);
    [indicator startAnimating];
    [myAlert addSubview:indicator];

    [self operateUpdate];
    [self updateImage];

    [self operationCompleted];
}

В updateImage метод operationUpdate и operationCompleted

- (void)updateImage {
NSString *snake_ico_file = @"snake_img_icn_";
NSString *filePath = [self dataFile:[snake_ico_file stringByAppendingString:@"0.jpg"]];
int max_count = [[self readData] count];
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
    for (int i = 0; i < max_count; i++) {
        NSString *path = @"http://exitosus.no.de/drngoo/image/";
        path = [path stringByAppendingFormat:@"%d",i];
        NSString *ico_path = [path stringByAppendingFormat:@"/ico"];

        //icon            
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *filename = [snake_ico_file stringByAppendingFormat:@"%d.jpg"];
        NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:filename];
        NSData *thedata = [NSData dataWithContentsOfURL:[NSURL URLWithString:ico_path]];;
        [thedata writeToFile:localFilePath atomically:YES];
       }
}

-(void) operationCompleted
{
       [myAlert dismissWithClickedButtonIndex:0 animated:YES];

       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message form System" message:@"Database was updated successful" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

       [alert show];
}

- (void)operateUpdate {

     NSString *filePath = [self dataFileSettingPath];
     int updatedVer = 0;
     int version = [self checkDatabase];
     if (version == -1) {
         updatedVer = [self createDataBase:0];
     } else {
         updatedVer = [self updateDataBase:version];
     }

     [self.settingInfo setObject:[NSString stringWithFormat:@"%d",updatedVer] forKey:@"DBVersion"];
   [self.settingInfo writeToFile:filePath atomically:YES];
}

Как я их исправляю и правильно работаю?


person WaiToNZa    schedule 20.03.2012    source источник
comment
Пожалуйста, отредактируйте заголовок или содержание вашего вопроса: UIAlertView как бы противоречит UIActivityIndicator.   -  person Nick Weaver    schedule 20.03.2012
comment
Проверяет базу данных на наличие обновлений. Я свой код отредактировал поверх.   -  person WaiToNZa    schedule 20.03.2012


Ответы (1)


AlertView отобразится только после завершения загрузки изображения. Одно из решений этой проблемы:

Создайте еще один класс ImageDownLoad.h

in .h

@property(nonatomic,assign)id delegate;
@property(nonatomic,retain) NSString *path;

in .m

@synthesize delegate;
@synthesize path;

Создайте метод, а именно,

-(void)startDownloadImageWithUrl:(NSURL*)imageUrl withLocalFilePath:(NSSTring*)filePath{
       path = filePath;
       receiveData = [NSMutableData data];
       NSURLRequest *request = [[NSURLRequest alloc]initWithURL:imageUrl];
       NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request];
 }

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
        [receiveData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
        [(id)delegate performSelector:@selector(SaveData:inFilePath:) withObject:receiveData withObject:path];
}

Это создаст соединение и начнет загрузку вашего изображения в отдельном классе. Затем в свой mai ViewController добавьте немного кода, как показано ниже.

  - (void)updateImage {
          NSString *snake_ico_file = @"snake_img_icn_";
          NSString *filePath = [self dataFile:[snake_ico_file stringByAppendingString:@"0.jpg"]];
          int max_count = [[self readData] count];
          if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
                 for (int i = 0; i < max_count; i++) {
                 NSString *path = @"http://exitosus.no.de/drngoo/image/";
                 path = [path stringByAppendingFormat:@"%d",i];
                 NSString *ico_path = [path stringByAppendingFormat:@"/ico"];

                      //icon            
                 NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                 NSString *documentsDirectory = [paths objectAtIndex:0];
                 NSString *filename = [snake_ico_file stringByAppendingFormat:@"%d.jpg"];
                 NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:filename];

                 ImageDownLoad *imageDown = [[ImageDownLoad alloc]init];
                 imageDown.delegate = self;
                 [imageDown startDownloadImageWithUrl:[NSURL URLWithString:ico_path] withLocalFilePath:localFilePath];

            }
   }

Этот метод будет вызываться каждый раз, когда загрузка изображения завершится.

   -(void)SaveData:(NSData*)data inFilePath:(NSString*)filePath{

          [data writeToFile:filePath atomically:YES];

   }

Ваш пользовательский интерфейс не будет задерживаться из-за этого :)

person rakeshNS    schedule 20.03.2012
comment
Я реализую это предложение. Затем я получаю SaveData]: неопознанный селектор, отправленный экземпляру. - person WaiToNZa; 20.03.2012
comment
Может ли этот метод дождаться завершения загрузки до появления сообщения? - person WaiToNZa; 20.03.2012
comment
@WaiToNZa Я редактировал, это должно быть похоже на [(id) delegate performSelector: @selector (SaveData: inFilePath :) withObject: receiveData withObject: path]; - person rakeshNS; 20.03.2012
comment
Большое спасибо за решение этой проблемы. : D - person WaiToNZa; 20.03.2012