我目前有一个共享扩展程序设置,可以将从Photo应用程序中选择的图像上传到服务器。使用下面的代码可以正常工作。
int fileNum=10;
NSItemProvider *attachment = inputItem.attachments[0];
if ([attachment hasItemConformingToTypeIdentifier:(NSString*)kUTTypeImage])
{
[attachment loadItemForTypeIdentifier:(NSString*)kUTTypeImage options:nil completionHandler:^(id item,NSError *error)
{
if (item)
{
NSLog (@"image %@",item);
//upload image here
NSData *data=[NSData dataWithContentsOfURL:item];
activityRecord.activityType=@"Images";
AppRecord *appRecord=[[AppRecord alloc] init];
appRecord.fileName=[NSString stringWithFormat:@"activity_%@%i(%i).jpg",activityRecord.supplierID,activityRecord.activityID,fileNum];
appRecord.fileBytes=data;
[fileRecords addObject:appRecord];
activityRecord.activityFiles=fileRecords;
[[Settings getInstance] uploadActivityRecord:activityRecord withDelegate:self];
[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}
}];
}
我有一个先前的问题,即loadItemForTypeIdentifier
方法没有被调用,并且通过在完成块中调用completeRequestReturningItems
来解决它。
我现在遇到的问题是,如果我想上传多个文件,那么我需要在for循环中调用loadItemForTypeIdentifier
(对于每个图像)但是如果调用completeRequestReturningItems
方法,我该怎么办?在第一个图像/项目之后?
非常感谢 保罗
答案 0 :(得分:4)
我最近遇到了同样的问题,并且能够通过添加计数器来解决它,并在图像成功完成阻止时倒计时。在loadItemForTypeIdentifier
完成块中,我会在completeRequestReturningItems
块中调用dispatch_once
之前检查是否已调用所有项目(仅为了安全起见)。
__block NSInteger imageCount;
static dispatch_once_t oncePredicate;
NSItemProvider *attachment = inputItem.attachments[0];
if ([attachment hasItemConformingToTypeIdentifier:(NSString*)kUTTypeImage])
{
[attachment loadItemForTypeIdentifier:(NSString*)kUTTypeImage options:nil completionHandler:^(NSData *item ,NSError *error)
{
if (item)
{
// do whatever you need to
imageCount --;
if(imageCount == 0){
dispatch_once(&oncePredicate, ^{
[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
});
}
}
}];
}
我不能说我觉得这是一个过于优雅的解决方案,所以如果有人知道处理这个常见用例的更合适的方法,我很乐意听到它。