iOS UIActivityViewController使用UIActivityItemProvider“;“忘记”;项目

iOS UIActivityViewController使用UIActivityItemProvider“;“忘记”;项目,ios,objective-c,uiactivityviewcontroller,Ios,Objective C,Uiactivityviewcontroller,我有一个更大的应用程序,应该能够共享多个图像。 我使用UIActivityViewController和UIActivityItemProvider实现了这一点,以异步使用这些项(这样我一次只需准备一个映像,而不必一次用所有映像填充内存来共享它们) 我被苹果空投的例子“启发”: 但是,当使用我的应用程序共享例如9张图像时(到相机卷=“保存9张图像”),只有4到7张图像最终出现在相机卷中,没有任何错误消息。 如果我反复重复,有时我会得到5张或6张看似随机的图片 我不能在这里发布我的应用程序,但我

我有一个更大的应用程序,应该能够共享多个图像。 我使用UIActivityViewController和UIActivityItemProvider实现了这一点,以异步使用这些项(这样我一次只需准备一个映像,而不必一次用所有映像填充内存来共享它们)

我被苹果空投的例子“启发”:

但是,当使用我的应用程序共享例如9张图像时(到相机卷=“保存9张图像”),只有4到7张图像最终出现在相机卷中,没有任何错误消息。 如果我反复重复,有时我会得到5张或6张看似随机的图片

我不能在这里发布我的应用程序,但我修改了上面的示例,它也会随机“失败”,将所有图像发送到相机卷

如果下载上述示例并用这些文件替换4个文件,则会显示问题:

APLANCIMAGEVIEWController.h:

#import <UIKit/UIKit.h>
#import "APLAsyncImageActivityItemProvider.h"

@interface APLAsyncImageViewController : UIViewController
@end
如果您像这样执行示例(使用菜单项“预处理后发送图像”,按“共享”按钮),通常或大部分情况下都无法将所有9个图像发送到相机卷

如果取消注释“APLANCIMAGEActivityItemProvider.m”中基本上只缩放输出图像的4行,那么它将始终工作

你能告诉我为什么吗?我觉得如果我知道这个谜的答案,我也可以修复我的应用程序

谢谢,


Nils

我想说,创建的
[UIImage imageWithImage:image scaledToFitToSize:imageSize]
图像在保存到camera roll之前是GC,但如果没有代码,我不知道该方法会发生什么。那个方法不是一个普通的UIImage方法,可能是一个类别

编辑 将添加到项目数组的for循环代码替换为该代码,然后取消对调整大小行的注释,看看是否有效

NSMutableArray *itemArray = [[NSMutableArray alloc] init];
for( int i = 0; i < 9;i++)
{
    UIImage *aiImage = [[[APLAsyncImageActivityItemProvider alloc] init] image];
    [itemArray addObject:aiImage];
}
NSMutableArray*itemArray=[[NSMutableArray alloc]init];
对于(int i=0;i<9;i++)
{
UIImage*aiImage=[[APLANCIMAGEActivityItemProvider alloc]init]image];
[itemArray addObject:aiImage];
}

这个问题的原因很简单

应用程序可使用的writer线程数量有限,因此同时写入太多图像可能会由于“Write Busy”错误而失败。您可以通过尝试使用UIImageWriteToSavedPhotosAlbum(或相应的资产/照片框架对应项)手动写入这些图像来验证这一点。 因此,调整图像大小只是隐藏了真正的问题,因为编写更小的图像需要更少的时间

这个问题可以通过限制写入程序的数量和/或在出现错误时重试来解决。 还要注意的是,-[UIActivityItemProvider item]是一个阻塞调用,但是没有同步的方法可以直接写入库。这可以通过dispatch\u信号量\u wait、NSCondition等来处理。
或者,如果您使用的是ReactiveCocoa,只需调用waituntlcompleted即可。

这是示例中能够调整图像大小的方法。(UIImage+Resize.h/m)。这无助于确定在保存之前是否对某个图像进行了垃圾收集。我怀疑是这样的,我发布了上面示例的下载链接,您知道如何防止该图像被“丢弃”吗?您可能猜到我是Obj-C NoOB,我的应用程序中有99%是C++,我只需要Objyc用于“共享”功能……不知道UIActivityViewController是如何调用<代码>项目<代码>来获取图像的。尝试将图像添加到数组中,而不是添加
APLANCIMAGEActivityItemProvider
对象<代码>[[APLANCIMAGEActivityItemProvider alloc]init].image应该可以工作。对不起,应该是
[[APLANCIMAGEActivityItemProvider alloc]init]image]
我遇到了同样的问题。你有没有找到解决办法?
#import <UIKit/UIKit.h>
@interface APLAsyncImageActivityItemProvider : UIActivityItemProvider
@end
#import "APLAsyncImageActivityItemProvider.h"
#import "UIImage+Resize.h"

@implementation APLAsyncImageActivityItemProvider


- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
    return [[UIImage alloc] init];
}

- (id)item
{
    UIImage *image = [UIImage imageNamed:@"Flower.png"];

    //CGSize imageSize;
    //imageSize.height = 1000;
    //imageSize.width = 1000;
    //image = [UIImage imageWithImage:image scaledToFitToSize:imageSize];

    return image;
}

- (UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(NSString *)activityType suggestedSize:(CGSize)size
{
    //The filtered image is the image to display on the other side.
    return [[UIImage alloc] init];
}

@end
NSMutableArray *itemArray = [[NSMutableArray alloc] init];
for( int i = 0; i < 9;i++)
{
    UIImage *aiImage = [[[APLAsyncImageActivityItemProvider alloc] init] image];
    [itemArray addObject:aiImage];
}