[英]IOS/Objective-C: Retrieve NSArray from completion block
我正在嘗試從方法的完成塊檢索EKReminders
數組。 該方法返回我想要的數組。 但是,我找不到在已知時間在主線程上重新獲得它的好方法,以至於我知道該塊已完成。
要檢索EKReminders
,Apple需要使用完成塊方法(與EKEvents
相反。)因此,我的提取代碼包含以下內容:
-(void) fetchReminders{
[self.eventStore fetchRemindersMatchingPredicate:predicate completion:^(NSArray *reminders) {
self.reminders = reminders;
}];
}
上面的代碼成功運行,並在完成后在ivar中放置提醒。
問題是我不知道該塊何時完成,因此如果我只是嘗試訪問self.reminders在view中會在調用上述方法后出現,它可能會返回空值,因為該塊尚未完成,我想通過某種方式來設置ivar當我知道該區塊已完成以消除競爭狀況時。
關於如何從完成塊中檢索值的一些關於SO的答案建議將完成塊傳遞給方法,如下所示:
//change above method to
-(void) fetchReminders withCompletion:(void (^)(NSArray *reminders))completion; {
and call it in viewwillappear with:
[self fetchReminders withCompletion:^(NSArray* reminders) {
self.reminders =remindersArray;
NSLog(@"remindersArray in viewwillappear%@",remindersArray);
}];
當我嘗試此操作時, viewwillappear
不會出現完成塊,因此出現了問題。
將感謝有關如何在已知時間點成功檢索在完成塊內檢索到的數組的任何建議。
有多種不同的方法可以實現這一目標。 您可以設置鍵值觀察器或NSNotification,也可以在reminders
對象的setter方法中執行必要的動作,甚至可以在該completeHandler塊中調用必要的動作。
從處理程序塊中調出
-(void) fetchReminders{
[self.eventStore fetchRemindersMatchingPredicate:predicate
completion:^(NSArray *reminders) {
dispatch_async(dispatch_get_main_queue(), ^{
self.reminders = reminders;
[self doWhatYaGottaDoMethod];
});
}];
}
鍵值觀察者方法
加載視圖時,您可以像這樣添加一個鍵值觀察器:
[self addObserver:self
forKeyPath:@"self.reminders"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:nil];
並實現此方法:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{
if([keyPath isEqualToString:@"self.reminders"]){
//You got your reminders, do what you gotta do
}
}
取消viewController時,請確保刪除觀察者,否則可能會崩潰
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.