我使用Amazon的iOS SDK(v1.3.2)將大文件上傳到AWS S3,我使用NSOperation的子類。這一切工作正常,但一些beta測試者遇到死鎖(iOS 5.1.1)。結果是操作被調度的NSOperationQueue被阻塞,因爲一次只允許一個操作運行。問題是我不能重現這個問題,而beta測試者每次都會遇到這個問題。NSOperation死鎖和塊NSOperationQueue
由於AWS iOS SDK的工作原理,操作非常複雜。但是,據我所知,根據我的測試,問題與AWS iOS SDK無關。操作的主要方法粘貼在下面。該操作的主要方法的想法是基於this Stack Overflow question。
- (void)main {
// Operation Should Terminate
_operationShouldTerminate = NO;
// Notify Delegate
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate operation:self isPreparingUploadWithUuid:self.uuid];
});
// Increment Network Activity Count
[self incrementNetworkActivityCount];
// Verify S3 Credentials
[self verifyS3Credentials];
while (!_operationShouldTerminate) {
if ([self isCancelled]) {
_operationShouldTerminate = YES;
} else {
// Create Run Loop
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
}
// Decrement Network Activity Count
[self decrementNetworkActivityCount];
NSLog(@"Operation Will Terminate");
}
該定型多載設置布爾_operationShouldTerminate
到YES
到終止操作的方法。該方法看起來像這樣。
- (void)finalizeMultipartUpload {
// Notify Delegate
dispatch_async(dispatch_get_main_queue(), ^{
[self.delegate operation:self didFinishUploadingUploadWithUuid:self.uuid];
});
// Operation Should Terminate
_operationShouldTerminate = YES;
NSLog(@"Finalize Multipart Upload");
}
,最終的日誌語句打印到控制檯,但在main方法的while循環似乎並不如退出在操作的主要方法,最終的日誌語句不打印到控制檯。因此,調度操作的操作隊列被阻止,並且任何調度的操作都不會被執行。
該操作的isFinished
方法簡單地返回_operationShouldTerminate
,如下所示。
- (BOOL)isFinished {
return _operationShouldTerminate;
}
奇怪的是,while循環不退出,這是更奇怪的是,它不會在任何我自己的測試設備(iPhone 3GS,iPad的1和iPad 3)的發生。任何幫助或指針非常感謝。
謝謝你的回答大衛。併發編程指南對我來說並不陌生,對於這類問題確實是一個有用的指導。保持運行循環在這種情況下似乎不成問題。 –