2013-10-24 54 views
0

我改變了舊的NSthread,因爲無法從後臺線程更新UI。現在我正在使用dispatch_asyncwhile(condition){}通過NSRURLConnection衝突連接嗎?

問題是這個代碼在ApplicationDidBecomeActive中第二次執行時(當用戶隱藏並再次顯示de應用程序時)永遠不會退出並保持無限循環。

在這裏,我在展示結束約dispatch_async新的代碼,該代碼NSURLConnection總是工作,簡歷...我不認爲這個問題是存在的

- (void)applicationDidBecomeActive:(UIApplication *)application 
    {  

    // first connection to the server through NSURLConnection, downloading a json list 
    [wsDataVideos getVideosData:URL_WS_VIDEOS]; 

    dispatch_queue_t secondDownloadQueue = dispatch_queue_create("name",NULL);    
    dispatch_async(secondDownloadQueue, ^{ 

      // wait for wsDataVideos has finished. IT SEEMS THIS COLLAPSES CPU ¿? 
      while (wsDataVideos.imported==NO) {} 

      // If are there new videos begins sincronous and slower download: 
      if ....{ 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       // Update the UI: inform user begins download 
       [menuViewController.badgeVideos setBadgeVideosText:@"Downloading..."]; 
       }); 

      // Download videos (sincro) 

      dispatch_async(dispatch_get_main_queue(), ^{ 
       // informs user is completed 
       [menuViewController.badgeVideos setBadgeVideosText:@"Downloaded"]; 
       }); 
      } 
     }); 

    } 

第一個連接(JSON),比我在等待,雖然:

-(void)getVideosData:(NSString *)url_ws{ 

    NSLog(@"Get videos data1 "); 

    if (wsData){ 
     [wsData setLength:0]; 
    } 
    else{ 
     wsData=[[NSMutableData alloc] init]; 
    } 

    NSURLRequest *reqCat=[NSURLRequest requestWithURL:[NSURL URLWithString:url_ws] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
    NSURLConnection *conCat=[[NSURLConnection alloc] initWithRequest:reqCat delegate:self]; 

} 

與他們的方法:

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
... 
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [wsData appendData:data]; 
} 

... 
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
... 

任何想法?再次感謝。

+0

什麼設置wsDataVideos.imported爲YES?那行代碼是否被執行過?是getVideosData:在主線程中執行(看起來是),並同步?看起來整個方法會在進入異步塊之前完成。 – shortstuffsushi

+0

第一次連接,通過異步NSURLConnection將wsDataVideos設置爲YES,在connectionDidFinishLoading(和coonectionDidFail..error)中。它在主線程中啓動,並且是異步 –

+0

在此代碼之前,我有NSThread新線程.. [線程啓動]而不是dispatch_async。儘管警告(CoreAnimation:http://stackoverflow.com/questions/19544207/how-to-avoid-coreanimation-warning-deleted-thread-with-uncommitted-catransactio) –

回答

0

如果我在裏面放置代碼的時候{}它有效,但我認爲這有點奇怪..大塊,壞代碼,不是嗎? 也許更好的解決方案會像dispatch_group_wait()這樣的東西嗎?

// wait for wsDataVideos has finished. IT SEEMS THIS COLLAPSES CPU ¿? 
    while (wsDataVideos.imported==NO) { 
     sleep(1) 
    } 
+0

完成之前要調用多少次(大致)?睡覺後立即完成嗎?如果是這樣,我在調用dispatch_async(someThread),然後dispatch_async(mainThread)時會看到類似的行爲。關於立即重新加入的事情似乎會造成問題,儘管我沒有真正關注過什麼或爲什麼。 – shortstuffsushi

+0

隨着wifi立即,但與一些可憐的3G可以是3或6秒... –

+0

解決方案是... ...很容易:dispatch_async爲新的異步線程,在此線程內啓動同步連接到Web服務。我想用異步的NSURlconnection ...我們將蘋果文檔稱爲「儘量不要使用同步連接」 –