2015-01-14 2 views
1

내 응용 프로그램이 forground에서 실행되는 동안 자산의 백그라운드 처리를 시도하고 있지만 주 스레드 및 우선 순위 역변환 문제로 인해 성능이 저하되는 문제가 계속 발생합니다. 배경 QOS_UTILITY dispatch_async 호출을 사용하고 있습니다. 비록 내가 그것을하고 있어도, eventIully는 requestImageDataForAsset를 호출하는 동안 주 스레드로 다시 호출하는 것으로 보인다.Utility Dispatch Queue에서 PhotoKit 사용시 문제

기본 PhotoKit 라이브러리의 핵심 데이터와 관련이 있습니다. 아래의 주요 스레드를 참조하십시오, 모든 작업이 백그라운드에서 이루어져야합니다. '사진'이라는 전화가있는 모든 장소 유틸리티 스레드에서 dispatch_async를 넣었습니다. 쓰레드가 QOS.UTILITY에서 QOS.DEFAULT로 그리고 나서 메인 큐로 어떻게 튀는 지 확인하십시오.

requestImageDataForAsset의 콜백에서 다음 목록을 작성한 후 콜백 (줄 # 19)의 원하는 대기열에 다시 넣습니다.하지만 주 스레드가 너무 많은 작업 또는 대기를하고 있기 때문에 UI 성능이 여전히 좋지 않습니다. . 이게 내 최선의 선택인가, 아니면 내 백그라운드 스레드에서 포토 킷을 처리하기 위해 할 수있는 일이 있을까?

Thread 1 Queue : com.apple.NSURLSession-work (serial) 
#0  0x0000000198b1ceb8 in semaphore_wait_trap() 
#1  0x0000000100a53214 in _dispatch_semaphore_wait_slow() 
#2  0x00000001876940b0 in -[__NSURLBackgroundSession _onqueue_uploadTaskForRequest:uploadFile:bodyData:completion:]() 
#3  0x0000000187693cd8 in __80-[__NSURLBackgroundSession uploadTaskForRequest:uploadFile:bodyData:completion:]_block_invoke() 
#4  0x00000001876932fc in __68-[__NSURLBackgroundSession performBlockOnQueueAndRethrowExceptions:]_block_invoke() 
#5  0x0000000100a44df0 in _dispatch_client_callout() 
#6  0x0000000100a4e5f4 in _dispatch_barrier_sync_f_slow() 
#7  0x0000000187693280 in -[__NSURLBackgroundSession performBlockOnQueueAndRethrowExceptions:]() 
#8  0x0000000187693c68 in -[__NSURLBackgroundSession uploadTaskForRequest:uploadFile:bodyData:completion:]() 
#9  0x00000001000f5c1c in Photos.UploadDevice.(sendUploadWithUrl in _2685BBCA4A43EF0FB41323498998E5EB) (Photos.UploadDevice)(ObjectiveC.NSURL, localFileUrl : ObjectiveC.NSURL) -> Swift.Bool at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:346 
#10  0x00000001000f4c08 in Photos.UploadDevice.(upload in _2685BBCA4A43EF0FB41323498998E5EB) (Photos.UploadDevice)(Swift.String, fileName : Swift.String, baseUrl : Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSURL>) -> Swift.Bool at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:330 
#11  0x00000001000fa1e0 in Photos.UploadDevice.(uploadFile in _2685BBCA4A43EF0FB41323498998E5EB) (Photos.UploadDevice)(Swift.String, size : Swift.Int64) ->() at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:537 
#12  0x00000001001136ec in Photos.UploadManager.((exportAsset in _2685BBCA4A43EF0FB41323498998E5EB) (Photos.UploadManager) -> (ObjectiveC.PHAsset, name : Swift.String, device : Photos.UploadDevice) ->()).(closure #1).(closure #2) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:770 
#13  0x0000000100108b24 in partial apply forwarder for Photos.UploadManager.((exportAsset in _2685BBCA4A43EF0FB41323498998E5EB) (Photos.UploadManager) -> (ObjectiveC.PHAsset, name : Swift.String, device : Photos.UploadDevice) ->()).(closure #1).(closure #2)() 
#14  0x0000000100113b54 in reabstraction thunk helper from @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @owned Swift.ImplicitlyUnwrappedOptional<Swift.String>, @unowned C.UIImageOrientation, @owned Swift.ImplicitlyUnwrappedOptional<Swift.Dictionary<ObjectiveC.NSObject, Swift.AnyObject>>) -> (@unowned()) to @callee_owned (@in (Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, Swift.ImplicitlyUnwrappedOptional<Swift.String>, C.UIImageOrientation, Swift.ImplicitlyUnwrappedOptional<Swift.Dictionary<ObjectiveC.NSObject, Swift.AnyObject>>)) -> (@out()) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:757 
#15  0x0000000100108ba8 in partial apply forwarder for reabstraction thunk helper from @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @owned Swift.ImplicitlyUnwrappedOptional<Swift.String>, @unowned C.UIImageOrientation, @owned Swift.ImplicitlyUnwrappedOptional<Swift.Dictionary<ObjectiveC.NSObject, Swift.AnyObject>>) -> (@unowned()) to @callee_owned (@in (Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, Swift.ImplicitlyUnwrappedOptional<Swift.String>, C.UIImageOrientation, Swift.ImplicitlyUnwrappedOptional<Swift.Dictionary<ObjectiveC.NSObject, Swift.AnyObject>>)) -> (@out())() 
#16  0x0000000100113ba4 in reabstraction thunk helper from @callee_owned (@in (Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, Swift.ImplicitlyUnwrappedOptional<Swift.String>, C.UIImageOrientation, Swift.ImplicitlyUnwrappedOptional<Swift.Dictionary<ObjectiveC.NSObject, Swift.AnyObject>>)) -> (@out()) to @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @owned Swift.ImplicitlyUnwrappedOptional<Swift.String>, @unowned C.UIImageOrientation, @owned Swift.ImplicitlyUnwrappedOptional<Swift.Dictionary<ObjectiveC.NSObject, Swift.AnyObject>>) -> (@unowned()) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:757 
#17  0x0000000100108c60 in partial apply forwarder for reabstraction thunk helper from @callee_owned (@in (Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, Swift.ImplicitlyUnwrappedOptional<Swift.String>, C.UIImageOrientation, Swift.ImplicitlyUnwrappedOptional<Swift.Dictionary<ObjectiveC.NSObject, Swift.AnyObject>>)) -> (@out()) to @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @owned Swift.ImplicitlyUnwrappedOptional<Swift.String>, @unowned C.UIImageOrientation, @owned Swift.ImplicitlyUnwrappedOptional<Swift.Dictionary<ObjectiveC.NSObject, Swift.AnyObject>>) -> (@unowned())() 
#18  0x0000000100113f3c in reabstraction thunk helper from @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @owned Swift.ImplicitlyUnwrappedOptional<Swift.String>, @unowned C.UIImageOrientation, @owned Swift.ImplicitlyUnwrappedOptional<Swift.Dictionary<ObjectiveC.NSObject, Swift.AnyObject>>) -> (@unowned()) to @callee_unowned @objc_block (@unowned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @unowned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSString>, @unowned C.UIImageOrientation, @unowned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSDictionary>) -> (@unowned()) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:757 
#19  0x000000018bad7380 in __65-[PHImageManager requestImageDataForAsset:options:resultHandler:]_block_invoke1437() 
#20  0x0000000100a44e30 in _dispatch_call_block_and_release() 
#21  0x0000000100a44df0 in _dispatch_client_callout() 
#22  0x0000000100a4975c in _dispatch_main_queue_callback_4CF() 
#23  0x0000000187c5dfa4 in __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__() 
#24  0x0000000187c5c04c in __CFRunLoopRun() 
#25  0x0000000187b890a4 in CFRunLoopRunSpecific() 
#26  0x0000000190d335a4 in GSEventRunModal() 
#27  0x000000018c4be3c0 in UIApplicationMain() 
#28  0x0000000100118e58 in main at /Users/possen/projects/wdp/App/main.m:14 
#29  0x0000000198a1ea08 in start() 
Enqueued from com.apple.root.default-qos (Thread 19)Queue : com.apple.root.default-qos (concurrent) 
#0  0x0000000100a4dc38 in _dispatch_barrier_async_f() 
#1  0x000000018bac8df0 in __163-[PHCoreImageManager _fetchAnySizeImageAsNon5551BytesWithRequest:library:format:bestFormat:optimalSourcePixelSize:sync:fireAndForgetCPLDownload:completionHandler:]_block_invoke729() 
#2  0x0000000100a44e30 in _dispatch_call_block_and_release() 
#3  0x0000000100a44df0 in _dispatch_client_callout() 
#4  0x0000000100a519a0 in _dispatch_root_queue_drain() 
#5  0x0000000100a52f18 in _dispatch_worker_thread3() 
#6  0x0000000198bd12e4 in _pthread_wqthread() 
#7  0x0000000198bd0fa8 in start_wqthread() 
Enqueued from NSManagedObjectContext 0x15fd29310 (Thread 19)Queue : NSManagedObjectContext 0x15fd29310 (serial) 
#0  0x0000000100a4655c in dispatch_async() 
#1  0x000000018baca94c in __163-[PHCoreImageManager _fetchAnySizeImageAsNon5551BytesWithRequest:library:format:bestFormat:optimalSourcePixelSize:sync:fireAndForgetCPLDownload:completionHandler:]_block_invoke_2808() 
#2  0x000000018bacad60 in __163-[PHCoreImageManager _fetchAnySizeImageAsNon5551BytesWithRequest:library:format:bestFormat:optimalSourcePixelSize:sync:fireAndForgetCPLDownload:completionHandler:]_block_invoke_2813() 
#3  0x000000018bac499c in __226-[PHCoreImageManager _fetchAnySizeImageAsNon5551BytesPossiblyThruAssetsdAndCPLWithRequest:library:format:optimalSourcePixelSize:wantsProperties:networkAccessAllowed:networkAccessForced:trackCPLDownload:sync:completionHandler:]_block_invoke() 
#4  0x000000018bac45d0 in -[PHCoreImageManager _fetchAnySizeImageAsNon5551BytesPossiblyThruAssetsdAndCPLWithRequest:library:format:optimalSourcePixelSize:wantsProperties:networkAccessAllowed:networkAccessForced:trackCPLDownload:sync:completionHandler:]() 
#5  0x000000018bacaa8c in __163-[PHCoreImageManager _fetchAnySizeImageAsNon5551BytesWithRequest:library:format:bestFormat:optimalSourcePixelSize:sync:fireAndForgetCPLDownload:completionHandler:]_block_invoke812() 
#6  0x000000019291b2b0 in __82-[PLPhotoLibrary _withDispatchGroup:synchronously:performBlock:completionHandler:]_block_invoke() 
#7  0x00000001879f9270 in developerSubmittedBlockToNSManagedObjectContextPerform() 
#8  0x0000000100a44df0 in _dispatch_client_callout() 
#9  0x0000000100a4f854 in _dispatch_queue_drain() 
#10  0x0000000100a48120 in _dispatch_queue_invoke() 
#11  0x0000000100a5175c in _dispatch_root_queue_drain() 
#12  0x0000000100a52f18 in _dispatch_worker_thread3() 
#13  0x0000000198bd12e4 in _pthread_wqthread() 
#14  0x0000000198bd0fa8 in start_wqthread() 
Enqueued from com.apple.root.default-qos (Thread 25)Queue : com.apple.root.default-qos (concurrent) 
#0  0x0000000100a4dc38 in _dispatch_barrier_async_f() 
#1  0x000000019291b278 in -[PLPhotoLibrary _withDispatchGroup:synchronously:performBlock:completionHandler:]() 
#2  0x000000018baca8cc in __163-[PHCoreImageManager _fetchAnySizeImageAsNon5551BytesWithRequest:library:format:bestFormat:optimalSourcePixelSize:sync:fireAndForgetCPLDownload:completionHandler:]_block_invoke807() 
#3  0x0000000100a4da28 in _dispatch_block_async_invoke_and_release() 
#4  0x0000000100a44df0 in _dispatch_client_callout() 
#5  0x0000000100a519a0 in _dispatch_root_queue_drain() 
#6  0x0000000100a52f18 in _dispatch_worker_thread3() 
#7  0x0000000198bd12e4 in _pthread_wqthread() 
#8  0x0000000198bd0fa8 in start_wqthread() 
Enqueued from com.apple.root.utility-qos (Thread 24)Queue : com.apple.root.utility-qos (concurrent) 
#0  0x0000000100a52b7c in _dispatch_async_f_slow() 
#1  0x000000018bac6e7c in -[PHCoreImageManager _fetchAnySizeImageAsNon5551BytesWithRequest:library:format:bestFormat:optimalSourcePixelSize:sync:fireAndForgetCPLDownload:completionHandler:]() 
#2  0x000000018bacf618 in -[PHCoreImageManager _processImageRequest:sync:]() 
#3  0x000000018bad3214 in -[PHImageManager requestAsynchronousImageForAsset:chainedToMasterRequest:targetSize:contentMode:options:resultHandler:]() 
#4  0x000000018bad3048 in -[PHImageManager requestAsynchronousImageForAsset:targetSize:contentMode:options:resultHandler:]() 
#5  0x000000018bad6ec4 in -[PHImageManager requestImageDataForAsset:options:resultHandler:]() 
#6  0x0000000100111cc4 in Photos.UploadManager.((exportAsset in _2685BBCA4A43EF0FB41323498998E5EB) (Photos.UploadManager) -> (ObjectiveC.PHAsset, name : Swift.String, device : Photos.UploadDevice) ->()).(closure #1) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:755 
#7  0x000000010009d958 in reabstraction thunk helper from @callee_owned() -> (@unowned()) to @callee_unowned @objc_block() -> (@unowned()) at /Users/possen/projects/wdp/App/Classes/CameraRollController.swift:50 
#8  0x0000000100a44e30 in _dispatch_call_block_and_release() 
#9  0x0000000100a44df0 in _dispatch_client_callout() 
#10  0x0000000100a519a0 in _dispatch_root_queue_drain() 
#11  0x0000000100a52f18 in _dispatch_worker_thread3() 
#12  0x0000000198bd12e4 in _pthread_wqthread() 
#13  0x0000000198bd0fa8 in start_wqthread() 
Enqueued from NSOperationQueue 0x170434820 :: NSOperation 0x1742564d0 (Thread 17)Queue : NSOperationQueue 0x170434820 :: NSOperation 0x1742564d0 (serial) 
#0  0x0000000100a52b7c in _dispatch_async_f_slow() 
#1  0x0000000100102ddc in Photos.UploadManager.(exportAsset in _2685BBCA4A43EF0FB41323498998E5EB) (Photos.UploadManager)(ObjectiveC.PHAsset, name : Swift.String, device : Photos.UploadDevice) ->() at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:739 
#2  0x000000010010fc2c in Photos.UploadDevice.((processAssets in _2685BBCA4A43EF0FB41323498998E5EB) (Photos.UploadDevice) ->() ->()).(closure #1).(closure #1) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:507 
#3  0x000000010010ca70 in Photos.UploadDevice.(fetchRemoteDirList (Photos.UploadDevice) -> (ObjectiveC.NSURL, block : (Swift.Optional<Swift.Dictionary<Swift.String, Photos.FileEntry>>, Swift.Optional<ObjectiveC.NSError>) ->()) ->()).(closure #2) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:284 
#4  0x000000010010b198 in reabstraction thunk helper from @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSURLResponse>, @owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSError>) -> (@unowned()) to @callee_owned (@in (Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSURLResponse>, Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSError>)) -> (@out()) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:236 
#5  0x00000001000f3aec in partial apply forwarder for reabstraction thunk helper from @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSURLResponse>, @owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSError>) -> (@unowned()) to @callee_owned (@in (Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSURLResponse>, Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSError>)) -> (@out()) with unmangled suffix "52"() 
#6  0x000000010010b3ec in reabstraction thunk helper from @callee_owned (@in (Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSURLResponse>, Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSError>)) -> (@out()) to @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSURLResponse>, @owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSError>) -> (@unowned()) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:236 
#7  0x000000010010b444 in reabstraction thunk helper from @callee_owned (@owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSURLResponse>, @owned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSError>) -> (@unowned()) to @callee_unowned @objc_block (@unowned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSData>, @unowned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSURLResponse>, @unowned Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSError>) -> (@unowned()) at /Users/possen/projects/wdp/App/Classes/UploadManager.swift:236 
#8  0x000000018763b2d4 in __49-[__NSCFLocalSessionTask _task_onqueue_didFinish]_block_invoke() 
#9  0x0000000188b5f508 in __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__() 
#10  0x0000000188ab0c94 in -[NSBlockOperation main]() 
#11  0x0000000188aa061c in -[__NSOperationInternal _start:]() 
#12  0x0000000188b6226c in __NSOQSchedule_f() 
#13  0x0000000100a44df0 in _dispatch_client_callout() 
#14  0x0000000100a4f854 in _dispatch_queue_drain() 
#15  0x0000000100a48120 in _dispatch_queue_invoke() 
#16  0x0000000100a5175c in _dispatch_root_queue_drain() 
#17  0x0000000100a52f18 in _dispatch_worker_thread3() 
#18  0x0000000198bd12e4 in _pthread_wqthread() 
#19  0x0000000198bd0fa8 in start_wqthread() 
+0

주 큐에서 photokit을 통해 이미지를 처리하는 데 문제가 없으며 주 스레드에 집중 UI가 있습니다. 우리가하는 일을 볼 수 있도록 코드를 게시하십시오. – xaphod

답변

0

어떻게 든 PHImageRequestOptions 객체의 동기 플래그를 잘못 해석했습니다. 이것을 true로 설정하면 이미지 요청이 만들어진 스레드와 동일한 스레드에서 호출됩니다. 이 기능을 사용하면 질문에서 문제를 일으킨 다른 스레드에 응답을 보냈습니다.