从Share Extension上传多个图像

时间:2015-02-02 10:31:22

标签: ios

我目前有一个共享扩展程序设置,可以将从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方法,我该怎么办?在第一个图像/项目之后?

非常感谢 保罗

1 个答案:

答案 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];

             });
         }
     }
  }];
}

我不能说我觉得这是一个过于优雅的解决方案,所以如果有人知道处理这个常见用例的更合适的方法,我很乐意听到它。