图片下载会减慢 UIActivityViewController 的出现时间
Image download slows UIActivityViewController appearance time
我在 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
}
}
您可以使用 Parse 的 PFImageView,它使用本地存储的占位符图像。因此视图将立即加载,一旦您的控制器完成初始化,您可以告诉 Parse 在后台加载图像,它应该为您完成剩下的工作。
PFImageView *creature = [[PFImageView alloc] init];
creature.image = [UIImage imageNamed:@”1.jpg”]; // placeholder image
creature.file = (PFFile *)file;
[creature loadInBackground];
查看此link了解更多详情。
编辑
此外,几乎每个 Parse 操作都有一个带有完成块版本的后台下载。可以在后台下载图片,在完成块中设置图片。
我在您的代码中没有看到任何 Parse 引用,但看起来它可能在您的 DataManager 中。看起来您正在做的是首先在后台下载数据,然后在完成后呈现 UIActivityViewController。
相反,我要做的是创建一个自定义的 UIActivityViewController,您将以相同的方式使用它,除了您将 image 设置为占位符图像并创建一个自定义的 属性 以保存您要加载的图像 URL。然后在自定义 UIActivityViewController 的 onViewDidAppear 中,您可以启动 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 下载图像的更多详细信息,请参阅此 question。
我在 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
}
}
您可以使用 Parse 的 PFImageView,它使用本地存储的占位符图像。因此视图将立即加载,一旦您的控制器完成初始化,您可以告诉 Parse 在后台加载图像,它应该为您完成剩下的工作。
PFImageView *creature = [[PFImageView alloc] init];
creature.image = [UIImage imageNamed:@”1.jpg”]; // placeholder image
creature.file = (PFFile *)file;
[creature loadInBackground];
查看此link了解更多详情。
编辑
此外,几乎每个 Parse 操作都有一个带有完成块版本的后台下载。可以在后台下载图片,在完成块中设置图片。
我在您的代码中没有看到任何 Parse 引用,但看起来它可能在您的 DataManager 中。看起来您正在做的是首先在后台下载数据,然后在完成后呈现 UIActivityViewController。
相反,我要做的是创建一个自定义的 UIActivityViewController,您将以相同的方式使用它,除了您将 image 设置为占位符图像并创建一个自定义的 属性 以保存您要加载的图像 URL。然后在自定义 UIActivityViewController 的 onViewDidAppear 中,您可以启动 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 下载图像的更多详细信息,请参阅此 question。