- (void) setRooms:(NSArray *)newRooms
{
NSLog(@"Main thread(cp3)... %d", [rooms count]);
rooms = newRooms;
[table reloadData];
NSLog(@"Main thread(cp4)... %d", [rooms count]);
}
- (void) parseJSONWithURL:(NSURL *)jsonURL
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSLog(@"Main thread(cp1)...%d", [rooms count]);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
NSLog(@"Background thread(cp1)...%d", [rooms count]);
NSError *error = nil;
// Request the data and store in a string.
NSString *resp = [NSString stringWithContentsOfURL:jsonURL
encoding:NSASCIIStringEncoding
error:&error];
// Convert the String into an NSData object.
NSData *data = [resp dataUsingEncoding:NSASCIIStringEncoding];
// Parse that data object using NSJSONSerialization without options.
NSDictionary *json = [[NSDictionary alloc] init];
json = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
// Return to the main thread to update the UI elements
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"Main thread(cp2)...%d", [rooms count]);
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[self setRooms:[json valueForKey:@"Rooms"]];
});
NSLog(@"Background thread(cp2)...%d", [rooms count]);
});
NSLog(@"Main thread(cp5)...%d", [rooms count]);
}
回答
試試這個
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
NSError *error = nil;
// Request the data and store in a string.
NSString *resp = [NSString stringWithContentsOfURL:jsonURL
encoding:NSASCIIStringEncoding
error:&error];
if (error == nil) {
// Convert the String into an NSData object.
NSData *data = [resp dataUsingEncoding:NSASCIIStringEncoding];
// Parse that data object using NSJSONSerialization without options.
NSDictionary *json = [[NSDictionary alloc] init];
json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
dispatch_sync(dispatch_get_main_queue(), ^{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
_rooms = [json valueForKey:@"Rooms"];
[_table reloadData];
});
}
});
,或者嘗試
[self performSelectorOnMainThread:@selector(udpateAfterFetch:) withObject: [json valueForKey:@"Rooms"] waitUntilDone:YES];
-(void)udpateAfterFetch:(NSArray or whatever *) yourObject
{
_rooms = yourObject;
[_table reloadData];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
表沒有被重新加載,因爲任何用戶界面更新,應在發生主線程,它不會在你的代碼行中發生。
嗨@satheeshwaran,謝謝你的回答。我嘗試了兩個想法,仍然沒有工作......在我最初的代碼中,我是通過以異步方式返回到主線程來進行UI更新的,而您建議以同步方式進行 - 這是行不通的。我嘗試在後臺作用域中使用選擇器技巧,或者返回主線程作用域,但仍然沒有運氣。 –
順便說一句,這個意外的行爲是,當我在iOS模擬器上運行它。如您所知,Apple Developer頁面已關閉,因此我無法訪問配置門戶並在真實設備上進行測試。不知道這是否只是因爲我在iOS模擬器上... –
現在嘗試編輯的部分,這與模擬器無關。 – satheeshwaran
- 1. 當我用Backbone觸發事件時,什麼也沒有發生
- 2. 當我使用PHP類時,什麼也沒有發生
- 3. Asp.net按鈕(什麼也沒有發生)
- 4. C#WinForm什麼也沒有發生
- 5. PopUpWindow之後什麼也沒有發生
- 6. 的NSTextField setAlphaValue - 什麼也沒有發生
- 7. 什麼也沒有發生按鈕
- 8. getjson什麼也沒有發生
- 9. 的Android ffmpgeg - 什麼也沒有發生
- 10. 生成一個列表 - 什麼也沒有發生
- 11. 當我在Heroku上運行db:seed時,什麼也沒有發生
- 12. 當我點擊NavigationBar中的UISearchBar時,什麼也沒有發生
- 13. 當你第二次點擊時什麼也沒有發生
- 14. 當按谷歌登錄按鈕時什麼也沒有發生
- 15. 當我運行節點時,什麼也沒有發生,永遠也是如此
- 16. Redux表單onSubmit什麼也沒有發生
- 17. 點擊鏈接:什麼也沒發生
- 18. 從UITableViewController調用modalTransitionStyle - 什麼也沒有發生
- 19. 調用類與JavaScript - 什麼也沒有發生
- 20. wpcf7_before_send_mail發佈形式掛起,什麼也沒有發生
- 21. 通過ajax發送值,在SQL中什麼也沒有發生
- 22. Dispatch_async沒有被調用,nslog也不是那麼好
- 23. 回滾沒有發生......爲什麼?
- 24. 當我運行這個素數因子程序時,什麼也沒有發生
- 25. 當點擊drupal主頁上的鏈接時,什麼也沒有發生
- 26. 當我點擊頁面上GridView與分頁時什麼也沒有發生
- 27. 當我點擊排序GridView中的列時,什麼也沒有發生
- 28. android - 當導航抽屜圖標被挖掘時什麼也沒有發生
- 29. 當列表沒有空值會發生什麼
- 30. 當我點擊github上的fork時,爲什麼沒有發生?
爲什麼你有2個東西? –
嗨@AbdullahShafique請注意,我也有兩個鏈接的ifs'...第一個如果檢查鏈接可用性和第二個檢查解析錯誤。其他的是相應的失敗塊 –