/ / Как да накараме MainThread да изчака някакво асинхронно действие? - обективни, ios, многопоточни, uitableview, асинхронни

Как да накарам MainThread да изчака докато се извърши някакво асинхронно действие? - цел-c, ios, multithreading, uitableview, асинхронни

аз имам UITableView с някакво съдържание, което е заредено в асинхронни начин. Когато потребителят завърти устройството, което трябва да направя [tableView reloadData] в -willRotateToInterfaceOrientation метод. ReloadData работи асинхронно в моя случай.

Разбирам, че reloadData работи в основната нишка, но изстрелва cellForRowAtIndexPath, който работи в моя случай.

Така че въпросът е как да накараме основната нишка да чака UITableView"s reloadData свършва.

Отговори:

2 за отговор № 1

Ако се обадите на reloadData отwillRotateToInterfaceOrientation след това се нарича на главната нишка. Всъщност UIViews НЕ са безопасни за нишки и трябва да бъдат третирани само от главната нишка (в случай че по някаква причина някой получи идеята да извика reloadData от друга нишка).

Мисля, че има объркване, свързано с това"асинхронен" като термин. Асинхронните обратни обаждания за делегати на потребителския интерфейс като willRotateToInterfaceOrientation се извикват на главната нишка. Да бъде асинхронно не означава непременно различна нишка (макар и да работи асинхронно "паралелно").

Бих препоръчал да прочетете документацията на Apple за NSRunLoop. Той е неразделна част от начина, по който се изпълняват iOS приложенията и е задължително за програмистите на приложенията да разберат.

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html


3 за отговор № 2

Може да използвате CFRunLoopRun да направите основната нишка да изчака, докато UITableView данните бъдат презаредени. След презареждане на данните повикването CFRunLoopStop резултат от CFRunLoopGetMain като параметър.


2 за отговор № 3

Вие ще трябва да заредите данните на таблицата във фонов режим, след това да се обадите на метода за презареждане на UITableView.

Можете да използвате GCD за лесно изпращане на функцията за натоварване асинхронно към фонова опашка. Когато тази задача е завършена, трябва да върнете работната нишка обратно към главната нишка блок, който извиква [tableView reloadData], Ето как:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

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

// load your table data here
[self loadMyTableData];

// when done dispatch back to the main queue to load the table
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{

[self.tableView reloadData];
});
});
...
}