2014-11-28 3 views
-1

My IOS base SDK - 8.1. dispatch_get_main_queue отлично работает, когда я работаю на 8.1 симуляторе. Однако, когда я запускаю его на 7.1-симуляторе, он не вызывается. Я заметил, что dispatch_get_main_queue был переоценен в iOS 8.0 и более поздних версиях.dispatch_get_main_queue не работает

Как я могу решить эту проблему? изменить базу SDK или что?

мой код

AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init]; 

    // audio track 
    AVMutableCompositionTrack *audioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
                     preferredTrackID:kCMPersistentTrackID_Invalid]; 
    // 
    NSError *error; 

    AVAsset *videoAsset = [AVAsset assetWithURL:videoURL]; 
    [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
         ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] firstObject] 
         atTime:kCMTimeZero 
          error:&error]; 
    if (error) { 
     NSLog(@"extract audio error!"); 
     return; 
    } 
    error = nil; 

    // audio path 
    NSString *path = [NSString stringWithFormat:@"%@newAudio.m4a", NSTemporaryDirectory()]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { 
     if (![[NSFileManager defaultManager] removeItemAtPath:path error:&error]) { 
      NSLog(@"audio cannot be saved!"); 
     } 
    } 
    // exporter 
    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
                     presetName:AVAssetExportPresetAppleM4A]; 
    exporter.outputURL = [NSURL fileURLWithPath:path]; 
    exporter.outputFileType = AVFileTypeAppleM4A; 
    exporter.shouldOptimizeForNetworkUse = YES; 
    [exporter exportAsynchronouslyWithCompletionHandler:^{ 
     //NSLog(@"export status: %ld", exporter.status); 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self exportDidFinish:exporter]; 
     }); 
    }]; 
} 
+0

У вас есть образец кода, чтобы показать нам, что вы делаете? Я использовал 'dispatch_get_main_queue' в iOS 8 так же, как и с iOS 7, и до сих пор не испытывал никаких проблем. –

+0

@Kai [экспорт экспортераAsynchronouslyWithCompletionHandler:^{ dispatch_async (dispatch_get_main_queue(),^{ [self exportDidFinish: exportorter]; }); }]; – CancerKnight

+0

Вы уже установили точку останова на '[self exportDidFinish: exportorter];', чтобы подтвердить, что вы никогда не выполняете эту строку в симуляторе iOS 7.1? Вам нужно разбить свой пример на отдельные строки, чтобы проверить. Если это не принесло ничего полезного, я бы рекомендовал добавить некоторый код KVO (как предложено в документации для ['exportAsynchronouslyWithCompletionHandler:'] (http://goo.gl/hxbmMI)) для 'status' и' error 'чтобы увидеть, если экспорт по какой-то причине не завершен. –

ответ

0

Наконец я понял. PresetName должен быть AVAssetExportPresetPassthrough, так что он отлично работает на симуляторе iOS 7. Я не знаю, почему, но спасибо @Kai и @Rob за ваши ответы.

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

  • Нет связанных вопросов^_^