Изтеглянето на изображение забавя времето за показване на 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