我有一個應用程序,它可以一次將圖像上傳到一堆地方,有點像Instagram風格。什麼可能導致此代碼不允許重新進入跳板?
它設置了一個NSOperationQueue
,它圍繞異步NSURLConnection
運行一堆NSOperation
包裝。
是開始這樣結束「回調不會被調用,因爲它們返回之前調用線程參加了大多數的問題。這是不那種問題。我上午讓我的回調預期,但我也在某種程度上阻止了當主頁按鈕被按下時背景應用程序,我一直認爲這是因爲沙盒而不能被阻止,但不知何故我已經完成了。什麼都不做,直到他們完成,在這一點(20-30秒後)的應用程序正常的背景。
** NB這似乎只發生在單核心處理器設備。只適用於我的iPhone 4,但不適用於我的4S或iPad 3. *
還有興趣嗎?這裏是我的設置:
self.uploadQueue = [[NSOperationQueue alloc] init];
[self.uploadQueue setMaxConcurrentOperationCount:1];
[self.uploadQueue setSuspended:YES];
稍後,我將操作添加到隊列中,然後取消它的啓動。下面是從那些NSOperation
子類的一些代碼:
- (BOOL)isConcurrent { return YES; }
- (BOOL)isExecuting { return self.executing; }
- (BOOL)isFinished { return self.finished; }
- (void)start {
// Omitted: check for cancel...
// Omitted: check if setup to run
[self willChangeValueForKey:@"isExecuting"];
self.executing = YES;
[self didChangeValueForKey:@"isExecuting"];
[self.sharer share];
CFRunLoopRun();
}
- (void)completeOperation {
[self willChangeValueForKey:@"isFinished"];
[self willChangeValueForKey:@"isExecuting"];
self.executing = NO;
self.finished = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
CFRunLoopStop(CFRunLoopGetCurrent());
}
的share
方法設置異步NSURLConnection
,並觸發其關閉,像這樣:
- (void)share {
// Omitted: connection setup
[NSURLConnection sendAsynchronousRequest:postRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error){
// handle error or success, then call
[self.currentOperation completeOperation];
}];
從副作用我試圖解決
除了,代碼的工作原理是,它可以完成它應有的功能,回調被調用,線程只要需要就保持活動狀態,而操作隊列一次只能運行指定數量的操作。
我試過了什麼?我試過了:
- 調用
[NSOperationQueue currentQueue]
上的NSURLConnection。這導致異步連接不回調塊。 - 強制每個NSOperation放在
start
方法的主線程中。這並沒有解決問題,也導致代碼有時不工作,用戶界面有時會凍結。 - 使用可變數組和GCD實現我自己的隊列以獲取正確的分派線程。無法讓它工作。
- 操作中的同步NSURLConnections。我並沒有真的嘗試過,因爲它不適合我。一些網絡框架(如Facebook iOS SDK)沒有同步選項。
在主頁按鈕按下後但操作完成之前暫停執行沒有任何意義。主線程似乎沒有任何東西等待鎖定或執行完成。
上午我這一設置像一個完整的笨蛋?這裏發生了什麼,我該如何解決它?
只是想知道 - 你有沒有嘗試在一個發佈版本的設備上運行它,未附加到調試器?我想知道是否可以讓自己繼續運行,因爲在運行調試版本時,監視程序進程並不嚴格。如果情況並非如此,那麼可以用蘋果提交一份錯誤報告。 –
雅,我已經嘗試過一個Ad-Hoc構建,結果相同。這是一個測試人員,他引起了我的注意。 – coneybeare
我總是發現獲得「併發」的NSOperation子類來執行正確的是非常容易出錯的。蘋果自己的[QA1712](http://developer.apple.com/library/ios/#qa/qa1712/_index.html)將此描述爲「非常棘手」。 –