Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从共享扩展上载多个图像_Ios - Fatal编程技术网

Ios 从共享扩展上载多个图像

Ios 从共享扩展上载多个图像,ios,Ios,我目前设置了一个共享扩展,可以将从照片应用程序中选择的图像上载到服务器。使用下面的代码可以很好地工作 int fileNum=10; NSItemProvider *attachment = inputItem.attachments[0]; if ([attachment hasItemConformingToTypeIdentifier:(NSString*)kUTTypeImage]) { [attachment loadItemForTypeIdentifier:(NSStr

我目前设置了一个共享扩展,可以将从照片应用程序中选择的图像上载到服务器。使用下面的代码可以很好地工作

 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
方法,我怎么做呢

非常感谢
Paul

我最近遇到了同样的问题,通过添加一个计数器并在图像成功完成其块时倒计时,我能够解决这个问题。在
loadItemForTypeIdentifier
完成块中,我检查在调用
dispatch\u once
块中的
completeRequestReturningItems
之前是否调用了所有项目(仅出于安全考虑)


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

你知道如何在使用照片应用程序的扩展时提取attributedContentText吗?它似乎总是空的,但如果扩展名是从Notes中使用的,则attributedContentText包含数据。@WagglyWonga我从未需要使用attributedContentText,所以我不确定,但apple文档中的描述表明它是一个对象、字符数据以及样式信息。你确定照片和视频有这些相关信息吗?嗨,瓦格利,你能解释一下你是如何使用uploadActivityRecord的吗?我正在努力使用服务器上传,因为他们不允许我使用后台线程来上传NSData。嗨,布鲁诺,我已经将NSOperation子类化了,这样我就有了一个下载队列,然后使用SOAP将数据上传到服务器。[link]是在objective-C中创建SOAP对象的有用服务。上传到服务器的限制是由于NSData的大小吗?感谢@WagglyWonga的回复,限制是在iOS端,不允许我在后台线程中上传,也不允许使用任何类型的块检查是否完成。但我也设法通过使用带有队列的sendAsynchronousRequest直接发送NSData来上传它。我只需要自己构建完整的多部分请求。它有效:)干杯
__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];

             });
         }
     }
  }];
}