[英]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工作。
你可以使用一個NSOperationQueue
與maxConcurrentOperationCount
設置為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]
}
(忽略並發問題……您可以按照其他幾個答案在displayMessages
或NSOperationQueue
使用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.