Загрузка изображения замедляет время появления UIActivityViewController

У меня есть кнопка «Поделиться» в действии UITableViewCell, которая вызывает UIActivityViewController. Это работает абсолютно нормально, за исключением того факта, что я загружаю изображение из Parse, и, поскольку изображение имеет довольно высокое разрешение, UIActivityViewController может отображаться медленно. Я добавил UIActivityIndicator на панель навигации, чтобы уведомить пользователя о том, что что-то загружается, но это все еще не лучший пользовательский интерфейс.

Мне было интересно, могу ли я сделать так, чтобы UIActivityViewController отображалось сразу при одновременной загрузке изображения в фоновом режиме, чтобы оно добавлялось в общий ресурс при загрузке? Либо так, либо есть способ начать загрузку изображения, как только пользователь проведет пальцем по UITableViewCell?

Если у кого-то есть другие предложения, то они будут очень признательны!

Спасибо!

РЕДАКТИРОВАТЬ:

Вот код, который у меня есть:

    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
        dispatch_async(dispatch_get_global_queue(priority, 0)) {
            let imageURL = NSURL(string: DataManager.sharedInstance.getRideByName(cell.rideNameLabel.text!)!.rideImage!)
            let imageData = NSData(contentsOfURL: imageURL!)

            dispatch_async(dispatch_get_main_queue()) {
                let image = UIImage(data: imageData!)
                let text = "I've just been to '\(cell.rideNameLabel.text!)' at \(self.parkPassed.name!)!"
                let appURL = NSURL(string: "http://itunes.apple.com/app/1021402097")

                let objectsToShare = [text, image!, appURL!]
                let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
                activityVC.excludedActivityTypes = [UIActivityTypeAddToReadingList, UIActivityTypeAssignToContact, UIActivityTypeCopyToPasteboard, UIActivityTypePostToFlickr, UIActivityTypePostToTencentWeibo, UIActivityTypePostToVimeo, UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeSaveToCameraRoll]

                self.presentViewController(activityVC, animated: true, completion: nil)

                self.navigationItem.titleView = nil
            }
        }

person user3746428    schedule 06.08.2015    source источник


Ответы (1)


Вы можете использовать PFImageView Parse, который использует изображение-заполнитель, которое хранится локально. Таким образом, представление загрузится немедленно, и как только ваш контроллер завершит инициализацию, вы можете указать Parse загрузить изображение в фоновом режиме, а все остальное он сделает за вас.

PFImageView *creature = [[PFImageView alloc] init];
creature.image = [UIImage imageNamed:@”1.jpg”]; // placeholder image
creature.file = (PFFile *)file;
[creature loadInBackground];

Подробнее см. по этой ссылке.

ИЗМЕНИТЬ

Кроме того, почти каждое действие Parse имеет загрузку в фоновом режиме с версией блока завершения. Вы можете загрузить изображение в качестве фона и установить изображение в блоке завершения.

Я не вижу никаких ссылок на Parse в вашем коде, но похоже, что он может быть внутри вашего DataManager. Похоже, вы сначала загружаете данные в фоновом режиме, а затем, по завершении, вы представляете UIActivityViewController.

Вместо этого я бы создал собственный UIActivityViewController, вы бы использовали его так же, за исключением того, что вы установили бы image в качестве изображения-заполнителя и создали настраиваемое свойство для хранения URL-адреса изображения, которое вы хотите загрузить. Затем в onViewDidAppear вашего пользовательского UIActivityViewController вы можете запустить PFQuery или другую асинхронную задачу для загрузки данных изображения в фоновом режиме, а по завершении вы можете загрузить реальное изображение и отклонить любые UIActivityIndictators, которые вы можете показывать.

PFQuery *query = [PFQuery queryWithClassName:@"myImages"];
[query whereKey:@"imageName" equalTo:@"your_image.jpg"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
  if (!error) {
    // The find succeeded.
    NSLog(@"Successfully retrieved %d images.", objects.count);
    // Do something with the found objects
    for (PFObject *object in objects) {
        NSLog(@"%@", object.objectId);
    }
  } else {
    // Log details of the failure
    NSLog(@"Error: %@ %@", error, [error userInfo]);
  }
}];

Подробнее о загрузке изображения с помощью PFQuery см. в этом вопросе.

person Dave S    schedule 06.08.2015
comment
Но как мне использовать PFImageView с UIActivityViewController? - person user3746428; 07.08.2015
comment
UIActivityViewController по-прежнему является просто контроллером представления. Вы можете использовать PFImageView так же, как и UIImageView. Возможно, если бы вы показали мне код, в котором вы устанавливаете изображение, я мог бы помочь больше. - person Dave S; 07.08.2015