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];
});
}
}
}];
}