2012-12-18 3 views
1

У меня есть этот код в моем приложении:Получение изображения из AlAsset сбои моего приложения

[[self assetsLibrary] assetForURL:info.media.url resultBlock:^(ALAsset *asset) { 
    ALAssetRepresentation *rep = [asset defaultRepresentation]; 
    CGImageRef img = [rep fullScreenImage]; 
    photoLayer.contents = img; 
} failureBlock:^(NSError *error) { 

}]; 

код попадет в строку, где переменная IMG населена и останавливается там, и приложение замков без каких-либо ошибок. NSLog echos имеет размер, поэтому я знаю, что актив есть. Я в недоумении относительно того, как устранить эту проблему, она работала раньше, но просто остановилась! Кто-нибудь видит что-то здесь, что неуместно?

Вот что URL выглядит следующим образом:

assets-library://asset/asset.JPG?id=36E68169-7BB4-48D7-B8E1-244234C9F1DA&ext=JPG 

трассировки стека, пока он заморожен:

Thread 1, Queue : NSManagedObjectContext Queue 
#0 0x37b1af38 in syscall_thread_switch() 
#1 0x331a5978 in OSSpinLockLock$VARIANT$wfe() 
#2 0x3318bcae in pthread_once() 
#3 0x348f66e2 in _internalCheckSupportsDCTDownScaling() 
#4 0x348f63fa in _initalizeService() 
#5 0x3318bcde in pthread_once() 
#6 0x348f63ba in jpegService() 
#7 0x3497009c in FigCreateCGImageFromJPEG() 
#8 0x356b5728 in PLCreateImageFromDataWithFormat() 
#9 0x35a3205e in __block_global_0() 
#10 0x356a03f4 in -[PLAssetsSaver requestSynchronousImageFromAsset:withFormat:completionBlock:]() 
#11 0x35a32028 in __40-[ALAssetRepresentation fullScreenImage]_block_invoke_0() 
#12 0x35a387ec in __53-[ALAssetRepresentationPrivate _performBlockAndWait:]_block_invoke_0() 
#13 0x328e79a0 in developerSubmittedBlockToNSManagedObjectContextPerform() 
#14 0x3121c5da in _dispatch_client_callout() 
#15 0x3121f80e in _dispatch_barrier_sync_f_invoke() 
#16 0x328e7b22 in -[NSManagedObjectContext performBlockAndWait:]() 
#17 0x35a351b2 in -[ALAssetsLibrary _performBlockAndWait:]() 
#18 0x35a385ac in -[ALAssetRepresentationPrivate _performBlockAndWait:]() 
#19 0x35a31f24 in -[ALAssetRepresentation fullScreenImage]() 
#20 0x0008a3ca in __31-[MasterTimeLine getPhotoItem:]_block_invoke_0 at /Users/jasoncandelora/Desktop/Glance/iOS/projects/VideoBuilderTest1/VideoBuilderTest1/MasterTimeLine.m:789 
#21 0x35a371b2 in __block_global_14() 
#22 0x3121c792 in _dispatch_call_block_and_release() 
#23 0x3121c5da in _dispatch_client_callout() 
#24 0x3121fe44 in _dispatch_main_queue_callback_4CF() 
#25 0x357ff1b0 in __CFRunLoopRun() 
#26 0x3577223c in CFRunLoopRunSpecific() 
#27 0x357720c8 in CFRunLoopRunInMode() 
#28 0x3702133a in GSEventRunModal() 
#29 0x340ec290 in UIApplicationMain() 
#30 0x0006eda4 in main at /Users/jasoncandelora/Desktop/Glance/iOS/projects/VideoBuilderTest1/VideoBuilderTest1/main.m:16 


Thread 3, Queue : com.apple.libdispatch-manager 
#0 0x37b1b5d0 in kevent64() 
#1 0x31221d26 in _dispatch_mgr_invoke() 
#2 0x3121d378 in _dispatch_mgr_thread() 



Thread 5 WebThread, Queue : (null) 
#0 0x37b1ae30 in mach_msg_trap() 
#1 0x37b1afd4 in mach_msg() 
#2 0x358002ba in __CFRunLoopServiceMachPort() 
#3 0x357ff030 in __CFRunLoopRun() 
#4 0x3577223c in CFRunLoopRunSpecific() 
#5 0x357720c8 in CFRunLoopRunInMode() 
#6 0x3376ea5c in RunWebThread(void*)() 
#7 0x331950e0 in _pthread_start() 
#8 0x33194fa8 in thread_start() 


Thread 8 com.apple.coremedia.player.async, Queue : (null) 
#0 0x37b2b08c in __psynch_cvwait() 
#1 0x3318db00 in _pthread_cond_wait() 
#2 0x33197cfc in pthread_cond_wait() 
#3 0x336ef8b8 in FigSemaphoreWaitRelative() 
#4 0x39b30eae in fpa_AsyncMovieControlThread() 
#5 0x3370d97a in figThreadMain() 
#6 0x331950e0 in _pthread_start() 
#7 0x33194fa8 in thread_start() 





Thread 9 com.apple.coremedia.player.remote, Queue : (null) 
#0 0x37b1ae30 in mach_msg_trap() 
#1 0x37b1afd4 in mach_msg() 
#2 0x39b370d8 in FigExpressNotificationThread() 
#3 0x3370d97a in figThreadMain() 
#4 0x331950e0 in _pthread_start() 
#5 0x33194fa8 in thread_start() 
+0

Что произойдет, если вы нажмете паузу в отладчике, когда он заблокирован? Можете ли вы опубликовать трассировки стека для всех потоков, которые вы видите в этот момент? –

ответ

0

В моем случае я перезагрузил устройство и сейчас работает. Спасибо за помощь.

0

Вы не должны использовать этот вид обмана пытается заставить извлечение асинхронных активов операции в синхронную операцию. Скорее всего, причиной этого является тупик, проверяйте трассировки стека для разных потоков, и вы, вероятно, видите несколько потоков, ожидающих семафора.

Я предлагаю вам удалить блокировку семафора и дать операции асинхронной.

Другое предложение: вы убедились, что пользователь действительно разрешил доступ к фотографиям (новая настройка конфиденциальности на iOS6)?

Что касается вывода стека вы публикуемый:

Я вижу FigSemaphoreWaitRelative и OSSpinLockLock $ ВАРИАНТА $ ВТЭ. Первый ждет семафора, который будет разблокирован. Последнее является другой формой блокировки, в то время как система, по-видимому, проверяет, может ли носитель, который вы пытаетесь получить доступ, может быть декодирован в аппаратном обеспечении (_internalCheckSupportsDCTDownScaling).

По какой-то причине эта операция не только застревает, но также блокирует основной поток, который является потоком 1. Возможно, у вас есть просмотр медиа-плеера (com.apple.coremedia.player.async), который блокирует видео аппаратного обеспечения, и это предотвращает тупик выше DCTDownScaling?

Короткий длинный рассказ: звучит так, будто вы должны подать радар для этого, очень похож на ошибку IOS для меня.

+0

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

+0

ОК, изменил мой код выше, все еще видя тот же глюк! – box86rowh

+0

Можете ли вы нажать кнопку паузы в отладчике и посмотреть на состояния стека? Что ждет чего? – Cocoanetics

0

Попробуйте переместить последнюю строку кода в основной очереди:

[[self assetsLibrary] assetForURL:info.media.url resultBlock:^(ALAsset *asset) { 
    ALAssetRepresentation *rep = [asset defaultRepresentation]; 
    CGImageRef img = [rep fullScreenImage]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     photoLayer.contents = img; 
    }; 
} failureBlock:^(NSError *error) { 

}]; 

Если это не работает, как большая актива это?

+0

Он никогда не попадает в эту строку, актив - это просто фотография, сделанная с помощью ipad 4. Я попробовал ваш код, но получил тот же результат. – box86rowh

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