2

我有一個應用程序,它可以一次將圖像上傳到一堆地方,有點像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]; 
    }]; 
從副作用我試圖解決

除了,代碼的工作原理是,它可以完成它應有的功能,回調被調用,線程只要需要就保持活動狀態,而操作隊列一次只能運行指定數量的操作。

我試過了什麼?我試過了:

  1. 調用[NSOperationQueue currentQueue]上的NSURLConnection。這導致異步連接不回調塊。
  2. 強制每個NSOperation放在start方法的主線程中。這並沒有解決問題,也導致代碼有時不工作,用戶界面有時會凍結。
  3. 使用可變數組和GCD實現我自己的隊列以獲取正確的分派線程。無法讓它工作。
  4. 操作中的同步NSURLConnections。我並沒有真的嘗試過,因爲它不適合我。一些網絡框架(如Facebook iOS SDK)沒有同步選項。

在主頁按鈕按下後但操作完成之前暫停執行沒有任何意義。主線程似乎沒有任何東西等待鎖定或執行完成。

Threads 1Threads 2

上午我這一設置像一個完整的笨蛋?這裏發生了什麼,我該如何解決它?

+0

只是想知道 - 你有沒有嘗試在一個發佈版本的設備上運行它,未附加到調試器?我想知道是否可以讓自己繼續運行,因爲在運行調試版本時,監視程序進程並不嚴格。如果情況並非如此,那麼可以用蘋果提交一份錯誤報告。 –

+0

雅,我已經嘗試過一個Ad-Hoc構建,結果相同。這是一個測試人員,他引起了我的注意。 – coneybeare

+0

我總是發現獲得「併發」的NSOperation子類來執行正確的是非常容易出錯的。蘋果自己的[QA1712](http://developer.apple.com/library/ios/#qa/qa1712/_index.html)將此描述爲「非常棘手」。 –

回答

0

編輯:

原來所有這些網絡的東西是一個紅色的鯡魚。這是一些循環CAAnimations,防止返回跳板以某種方式。

原始猜測:

我的猜測:你不應該調用你的啓動方法CFRunLoopRun;併發操作的啓動方法預計將在操作完成並稍後完成之前返回。你可能會抓住一些GCD鎖(線程?)系統需要調度其他任務。

如果您需要通過CFRunLoopRun獨佔一個線程,您應該在start開始自己的線程,然後返回。不過,我認爲這樣做會更容易,只是爲了不使用NSOperation並從主線程啓動(已經是異步)url連接,並在每個連接完成時保持一系列共享。

其實,我認爲問題是CFRunLoopStop(CFRunLoopGetCurrent()):你在主線程上運行這個,所以你要停止主運行循環!

+0

嗯,剛試過這種方式...仍然阻止應用程序退出。我完全刪除了nsoperations並從主線程調用。 – coneybeare

+0

你還能'CFRunLoopRun'嗎?我也要添加另一個想法。 –

+0

不,runloop的東西在操作中,現在我沒有使用。我在我的應用程序中添加了一個切換開關,當我正在調試時。現在,它只是一個數組,它一次運行異步連接1,並在前一個完成塊上觸發下一個。 – coneybeare

相關問題