[英]Queues in iOS Objective-C
我正在嘗試在iOS項目的Objective C
創建隊列。 我希望活動監視器在主線程上運行並繼續執行此操作,直到獲得UITableView
所有數據為止。 這是我的代碼
[super viewDidLoad];
// create the activity indicator in the main queue
dispatch_async(dispatch_get_main_queue(), ^{
UIActivityIndicatorView *ac = [[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[ac startAnimating];
});
MyQueue = dispatch_queue_create("com.example.gcd", NULL);
dispatch_async(MyQueue, ^{
self.client = [MSClient clientWithApplicationURLString:@"https://outnight-mobile.azure-mobile.net/" applicationKey:@"okYeRGfBagYrsbkaqWIRObeDtktjkF10"];
self.table = [self.client tableWithName:@"notifications"];
self.rowitems = [[NSMutableArray alloc] init];
MSQuery *query = [self.table query];
query.fetchLimit = 3;
[query readWithCompletion:^(NSArray *items, NSInteger totalCount, NSError *error)
{
//add the items to our local cop
self.rowitems = [items mutableCopy];
//[self.TableView reloadData];
}];
});
因此,您可以看到我為UIActivityIndiactor
創建了一個主線程,然后為我的sql工作創建了第二個線程。 指標不起作用,它直接進入UITableView
,甚至不進入myQueue進行分派。 這是否意味着我的UIActivityIndicitor
無法正常工作,所以它什么也不做? 我正在嘗試使用GCD
以便可以在運行[tableview reload data]
之前准備好所有[tableview reload data]
。 有任何建議嗎?
謝謝
傑森
您的代碼不會“創建主線程”。 viewDidLoad
已經在主線程上被調用,因此您只是在排隊等待稍后在主線程上執行的塊。 該塊創建UIActivityIndicatorView
的實例,然后將其銷毀(因為您沒有將其添加為子視圖或存儲對其的引用)。
刪除該塊,將其添加為子視圖,並將其引用存儲在@property中。
您的第二個代碼塊將代碼排隊在后台線程上運行(盡管它不會直接創建該線程)。 此塊還應該是:
UIActivityIndicatorView
但:
您正在使用MSQuery
。 IIRC這需要從主線程運行。 它會自動在后台線程上運行所有網絡,並回調(完成塊)到主線程。
因此,您可能應該刪除GCD的其他用途,而只是修改活動指示器並重新加載表格視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.