簡體   English   中英

iOS Objective-C中的隊列

[英]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中。

您的第二個代碼塊將代碼排隊在后台線程上運行(盡管它不會直接創建該線程)。 此塊還應該是:

  1. 返回主線程,並執行以下操作:
  2. 從顯示中刪除UIActivityIndicatorView
  3. 重新加載表格視圖

但:

您正在使用MSQuery IIRC這需要從主線程運行。 它會自動在后台線程上運行所有網絡,並回調(完成塊)到主線程。

因此,您可能應該刪除GCD的其他用途,而只是修改活動指示器並重新加載表格視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM