2015-02-02 4 views
3

В настоящее время у меня установлено расширение общего доступа, которое загрузит изображение, выбранное из приложения «Фото», на сервер. Это работает отлично, используя приведенный ниже код.Загрузка нескольких изображений из расширения Share

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]; 
      [email protected]"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 в блоке завершения. Проблема в том, что если я хочу загрузить несколько файлов, мне нужно вызвать loadItemForTypeIdentifier в цикле for (для каждого изображения), но как я могу это сделать, если метод метода completeRequestReturningItems будет вызываться после первого изображения/элемента?

Большое спасибо Пол

+0

Привет, Waggly, вы можете объяснить, как вы используете uploadActivityRecord, я борюсь с загрузкой сервера, потому что они не позволяют мне использовать фоновый поток с загрузкой NSData. –

+0

Привет, Бруно, я подклассифицировал NSOperation так, чтобы у меня была очередь загрузки, а затем использовала SOAP для загрузки данных на сервер. [link] http://sudzc.com/ - полезный сервис для создания ваших SOAP-объектов в объекте-C. Является ли ограничение на загрузку на ваш сервер из-за размера ваших NSData? – WagglyWonga

+0

Спасибо @WagglyWonga за ответ, ограничение было на стороне iOS, не позволяя мне загружать фоновый поток или использовать какие-либо блоки для проверки завершения. Но мне удалось загрузить его, отправляя NSData напрямую, используя sendAsynchronousRequest с очередью. Мне просто нужно было создать полный многопрофильный запрос. Это работает :) Cheers –

ответ

3

Я столкнулся с той же проблемой в последнее время и был в состоянии решить ее путем добавления счетчика и отсчет как изображения успешно завершили свой блок. В блоке завершения 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]; 

      }); 
     } 
    } 
    }]; 
} 

Я не могу сказать, что я чувствую, что это слишком элегантное решение, однако, так что если кто-то знает более подходящий способ обработки этого общего варианта использования я хотел бы услышать об этом.

+0

Отлично, трюк, спасибо. – WagglyWonga

+0

Вы выяснили, как извлечь атрибутContentText при использовании расширения из приложения «Фото»? Он всегда кажется пустым, но если расширение используется в Notes, атрибутContentText содержит данные. – WagglyWonga

+0

@WagglyWonga Мне никогда не приходилось работать с атрибутомContentText, поэтому я не уверен, но описание в документации на Apple предполагает, что это [NSAttributedString] (https://developer.apple.com/library/prerelease/ios/documentation/Cocoa /Reference/Foundation/Classes/NSAttributedString_Class/index.html), символьные данные, а также информацию о стиле. Вы уверены, что фотографии и видео связаны с ними? – elsamp

Смежные вопросы