2011-05-25 59 views
1

我正面臨一個奇怪的問題。我有一個方法用一些數據(fetchData)填充數組(實際上相當多,而且有點慢)。我正在使用該數組來構建表的行。TableViewController的表視圖直到數據加載才顯示

我已經嘗試在我的代碼中的多個地方調用fetchData,在視圖構造的不同時間,我似乎總是得到以下內容:顯示的黑色屏幕直到數組中的數據是加載。我從下面調用了fetchData:

  • (void)viewDidLoad;
  • (void)viewWillAppear:(BOOL)animated;
  • (void)viewDidAppear:(BOOL)animated;

由於我使用的是導航視圖控制器,應用程序似乎掛起很糟糕,因爲它被卡在黑屏上。我希望我的代碼能夠實現的是顯示一個空表,帶有一個進度指示器,直到數據加載 - 然後刷新。不幸的是我沒有得到這麼遠,因爲視圖沒有被加載,無論我在哪裏調用fetchData。

幫助感謝!

P.S.爲了解決這個問題,我甚至嘗試使用TTTableViewController,但加載視圖從不顯示。典型。 嘆息

回答

2

您的加載方法必須阻止用戶界面。你應該將它移動到另一個線程並讓數據加載到那裏。你可以在viewDidLoad中實例化線程。

這是(使用GCD)

dispatch_queue_t downloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(downloadQueue, ^{ 

    ... Move all the loading part here. 

    dispatch_async(dispatch_get_main_queue(),^{ 
     ... Do all the UI updates, mostly, [tableView reloadData]; 
    }) 
}) 
+2

請注意,在另一個線程中獲取數據之後,UI的任何更改都必須在主線程中完成。 – 2011-05-25 22:43:13

+0

這聽起來很可怕。我以前沒有處理過多個線程。我可以使用Grand Central Dispatch嗎?你有任何可以工作的例子嗎? – 2011-05-25 22:44:00

+0

有幾個有用的指南,但我建議[這](http://cocoasamurai.blogspot。COM/2009/09 /導向到塊-隆重-中央dispatch.html)。我已經編輯了一個關於你最終會做什麼的總體思路。 – 2011-05-25 22:54:45

1

有可能,你可以添加一個計時器到某處延緩你的viewDidAppear方法調用了一個框架代碼,你需要。例如:

- (void)viewDidAppear:(BOOL)animated { 
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fetchData) userInfo:nil repeats:NO]; 
} 

這會讓您的應用程序有時間加載用戶界面並開始加載屏幕,然後再開始提取數據。你也可以嘗試在後臺線程中獲取數據,如果你更願意走這條路線

0

我有一個問題,最初沒有加載表視圖,但它工作n另一個.m文件我有。這裏是工作的一個:

添加到您的viewDidLoad:

NSError *error = nil; 
if (![[self fetchedResultsController] performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

,這對實現塊:

#pragma mark - 
#pragma mark Fetched results controller 

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController == nil) { 
     // Create the fetch request for the entity. 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     // Edit the entity name as appropriate. 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"OMFrackinG" inManagedObjectContext:managedObjectContext]; 
     [fetchRequest setEntity:entity]; 

//分組和排序可選

 //NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"country" ascending:YES]; 

     NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"state" ascending:YES];// was name 

     NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 

     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,sortDescriptor2, nil]; 

     [fetchRequest setSortDescriptors:sortDescriptors]; 
     propriate. 

     NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"state" cacheName:nil];//@"state" 
     aFetchedResultsController.delegate = self; 
     self.fetchedResultsController = aFetchedResultsController; 

     [aFetchedResultsController release]; 
     [fetchRequest release]; 
     [sortDescriptor1 release]; 
     [sortDescriptor2 release]; 
     [sortDescriptors release]; 
    } 

    return fetchedResultsController; 
} 
相關問題