NSProgress::completedUnitCount setter hangs


  • (void)URLSession:(NSURLSession*)会话任务:(NSURLSessionTask*)任务didSendBodyData:(int64_t)字节发送totalBytesSsent:(int64_t)totalBytesSenttotalBytesExpectedToSend:(int64_t)totalBytes ExpectedToSend{self.progress.completedUnitCount=发送的字节总数;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^这挂在ios 9.0上有什么办法吗???

  • (void)URLSession:(NSURLSession*)会话任务:(NSURLSessionTask*)任务didSendBodyData:(int64_t)字节发送totalBytesSsent:(int64_t)totalBytesSenttotalBytesExpectedToSend:(int64_t)totalBytes ExpectedToSend;在主线程上调用,这并不重要

(lldb)bt*线程#1:tid=0xd6e1,0x00000001984a0c6c libsystem_kernel.dylib semaphore_wait_trap + 8, queue = 'com.apple.main-thread', activity = 'send control actions', 1 messages, stop reason = signal SIGSTOP * frame #0: 0x00000001984a0c6c libsystem_kernel.dylib信号量wait_rap+8帧#1:0x000000019857a97c libsystem_platform.dylib _os_semaphore_wait + 24 frame #2: 0x00000001007bd428 libdispatch.dylib _dispatch_barrier_sync_f_slow+600帧#3:0x00000001835af270基础-[NSConcreteObservationBuffer _receiveBox:] + 248 frame #4: 0x00000001836180b0 Foundation _NSKVO1适配器交付+388帧#5:0x000000183617ea0 Foundation _NSKVO1AdaptorSlowDeliver + 264 frame #6: 0x0000000183523b84 Foundation-[NSKeyValueObservenceValueForKeyPath:ofObject:change:context:]+424帧#7:0x00000001834fdd4基础NSKeyValueNotifyObserver + 304 frame #8: 0x00000001834ff8fc Foundation NSKeyValueDidChange+404帧#9:0x00000001834ea114 Foundation -[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:] + 120 frame #10: 0x000000018258fab0 CoreFoundation __53-[__NSArrayM enumerateObjects WithOptions:usingBlock:]_block_invoke+132帧#11:0x000000018258f9a8核心基础-[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 308 frame #12: 0x00000001836cc158 Foundation-[NSProgress _setValueForKeys:settingBlock:]+600帧#13:0x00000001836cc87c基础`-[NSProgress setCompletedUnitCount:]+124

PS:如果我避免将UIProgressView::observedProgress设置为该NSProgress,它会正常工作!?

通过繁忙等待解决

-(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

Boy帮了我一把。我的应用程序在递增Progress.completedUnitCount时冻结了。(在主线程上。)我假设这会触发一个setter,因为它有一个副作用——移动进度条,这是这样做的全部原因。

我的Swift 4解决方案是这样结束通话:

DispatchQueue.global(qos: .utility).async {
    self._decompressionProgress.completedUnitCount += 1
}

我仍然不太明白为什么这样。。。和很多事情没什么不同。

最新更新