簡體   English   中英

如何等待方法完成后再調用它?

[英]How do I wait for a method to finish before calling it again?

我正在使用Parse的框架構建一個簡單的消息傳遞應用程序。 我有一個名為displayMessages的方法。 每次電話收到推送時都會調用此方法。

但是,由於該消息正在Parse數據庫中運行,因此如果它已經在運行,我不想再次調用它。 我想等到完成再調用它。

我正在使用以下代碼:

-(void)receivedPush
{

    [self displayMessages];

}

和:

-(void)displayMessages
{
 //code here
}

如果調用了收到的推送,我希望它等到displayMessages完成后再調用它。 有人可以為此指出正確的方向嗎?

更新

我嘗試使用NSOperationQueue方法,並意識到盡管這確實可以等待displayMessages ,但不會導致所需的行為。

displayMessages我有: [PFObject deleteAllInBackground:toDelete]; 實際上,我需要等待完成才能再次調用displayMessages

創建一個NSOperationQueue並設置maxConcurrentOperationCount到1.實施你的數據訪問的方法的操作(可能是框式操作),並將其提交到隊列中。 (我比gcd更好,因為您可以取消或測試隊列中已有的項目數。)

請注意,如果該方法實際顯示內容,則需要分派回主隊列以進行UI工作。

你可以使用一個NSOperationQueuemaxConcurrentOperationCount設置為1

NSOperationQueue聲明為您的類的iVar,在init方法中對其進行init並進行設置

[_opQueue setMaxConcurrentOperationCount:1];

然后當您收到推送時:

- (void)receivedPush {
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(displayMessages) object:nil];
    [_opQueue addOperation:op];
}

最簡單快捷的方法是創建BOOL isExecuting並檢查是否可以基於該方法調用方法(在執行之前但在檢查之后和執行之后更改值)

如何實現一個相當輕量級的解決方案:

@property (nonatomic, assign) BOOL needsToDisplayMessages;
@property (nonatomic, assign) BOOL displayingMessages;

然后

-(void)receivedPush
{
    if (!self.displayingMessages) {
        [self displayMessages];
    } else {
        self.needsToDisplayMessages = YES;
   }
}


-(void)displayMessages
 {
  self.needsToDisplayMessages = NO;
  self.displayingMessages = YES;
  //long-running code here

  self.displayingMessages = NO;
  if (self.needsToDisplayMessages) {
       [self displayMessages]
  } 

(忽略並發問題……您可以按照其他幾個答案在displayMessagesNSOperationQueue使用GCD)

根據新的更新要求,您可以使用deleteAllInBackground:block: 根據文件

“異步地一次刪除所有對象的集合,並在完成后執行該塊。”

為什么不使用以下命令安排每個消息處理:

-(void)receivedPush
{
  dispatch_async(dispatch_get_main_queue(), ^{
    /* Show the update on the display */
    NSLog(@"Handling new messages");
    NSArray *newMessages=<populate with new messages>;
    [handler displayMessages:newMessages];            
  });
}

這將使您對每組輸入的處理排隊。一次只運行一個displayMessages。

暫無
暫無

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

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