NSProgress:: завершено зависание сеттера
(void)URLSession:(NSURLSession *) сеансовая задача:(NSURLSessionTask *) задача didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedTnSextSource_set_set_Stend_Stext_StendStoStedStoST ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ что с этим делать???
(void)URLSession:(NSURLSession *) задача сеанса:(NSURLSessionTask *) задача didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend; вызывается в главном потоке не так, чтобы это имело значение
(lldb) bt * thread # 1: tid = 0xd6e1, 0x00000001984a0c6c libsystem_kernel.dylibsemaphore_wait_trap + 8, queue = 'com.apple.main-thread', activity = 'send control actions', 1 messages, stop reason = signal SIGSTOP
* frame #0: 0x00000001984a0c6c libsystem_kernel.dylib
semaphore_wait_trap + 8 кадров # 1: 0x000000019857a97c libsystem_platform.dylib_os_semaphore_wait + 24
frame #2: 0x00000001007bd428 libdispatch.dylib
_dispatch_barrier_sync_f_slow + 600 кадров № 3: 0x00000001835af270 Foundation-[NSConcreteObservationBuffer _receiveBox:] + 248
frame #4: 0x00000001836180b0 Foundation
_NSKVO1AdaptorDeliver + 388 frame # 5: 0x0000000183617ea0 Foundation_NSKVO1AdaptorSlowDeliver + 264
frame #6: 0x0000000183523b84 Foundation
- [NSKeyValueObservance наблюдение ValueForKeyPath:ofObject: изменение: контекст:] + 424 кадра # 7: 0x00000001834ffdd4 FoundationNSKeyValueNotifyObserver + 304
frame #8: 0x00000001834ff8fc Foundation
NSKeyValueDidChange + 404 frame # 9: 0x00000001834ea114 Foundation-[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:] + 120
frame #10: 0x000000018258fab0 CoreFoundation
__53 - [__ NSArrayM enumerateObjectsWithOptions: usingBlock:] _ block_invoke + 132 кадра # 11: 0x000000018258f9a8 CoreFoundation-[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 308
frame #12: 0x00000001836cc158 Foundation
- [NSProgress _setValueForKeys: settingBlock:] + 600 кадров # 13: 0x00000001836cc87c Foundation`- [NSProgress setCompletedUnitCount:] + 124
PS: если я избегаю установки UIProgressView:: seenProgress на этот NSProgress, он работает нормально!?
2 ответа
Решено с занятым ожиданием
-(void)showUploadingUI
{
myHardAssert([[NSThread currentThread] isMainThread], @"");
self.progressView.hidden = NO;
NSProgress *progress = urlsession.progress;
if( [self.progressView respondsToSelector:@selector(observedProgress)]) {
// this causes hang self.progressView.observedProgress = progress;
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
while(progress.completedUnitCount < progress.totalUnitCount) {
dispatch_sync(dispatch_get_main_queue(), ^{
self.progressView.progress = progress.fractionCompleted;
});
[NSThread sleepForTimeInterval:0.033];
}
dispatch_sync(dispatch_get_main_queue(), ^{
self.progressView.progress = 1;
});
....
дополнительное преимущество - обратная совместимость для ios < 9
Мальчик сделал это, чтобы помочь мне. Мое приложение зависало при увеличении Progress.completedUnitCount
, (В главном потоке.) Я предполагаю, что это вызывает сеттер, так как есть побочный эффект - перемещение индикатора выполнения, и вся причина для этого.
Моим решением Swift 4 было обернуть вызов так:
DispatchQueue.global(qos: .utility).async {
self._decompressionProgress.completedUnitCount += 1
}
Я до сих пор не совсем понимаю, почему это работает... мало чем отличается.