それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

リマインダ(Reminders.app)をターミナルから使うためにEventKitを使う(3)

リマインダのアイテムの削除

前回までで、リマインダの一覧を検索できるようになったので、検索したものを削除してみる。

ただし、リマインダの「削除」をどう考えるか。削除=完了、削除=抹消と二通りに捉えることができるので、まずは通常の削除=「保存から消す」を書きます。

//
//  main.m
//  reminders
//
//  Created by takuya on 20150619.
//  Copyright (c) 2015年 takuya. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <EventKit/EventKit.h>
int main(int argc, const char * argv[]) {
  @autoreleasepool {
      //指定したリマインダのTODOを一覧する。
    NSString *name = @"お買い物";
    EKEventStore *eventStore = [[EKEventStore alloc] init];
    EKCalendar *cal = [eventStore defaultCalendarForNewReminders];
    NSArray *calendars = [eventStore calendarsForEntityType:EKEntityTypeReminder];

    for (EKCalendar *calendar in calendars)
    {
      if ([calendar.title isEqualToString:name]) {
        printf("「%s」のカレンダを発見\n", [calendar.title UTF8String]);
        cal = calendar;

      }
    }
    __block BOOL busy = YES;
    __block NSArray *reminders;
    NSPredicate *predicate = [eventStore predicateForRemindersInCalendars:[NSArray arrayWithObject:cal]];
    [eventStore fetchRemindersMatchingPredicate:predicate completion:^(NSArray *list) {
      reminders = list;
      busy = NO;
    }];
    while( busy ){ sleep(0.1);}
    for( EKReminder *reminder in reminders){
      printf("「%s」を削除\n", [reminder.title UTF8String]);
      NSError *error;
      if(![eventStore removeReminder:reminder commit:YES error:&error])
        NSLog(@"%@", error);

    }
    return 0;
  }
}

検索するところまでは同じ。検索結果のリマインダ・アイテムをEventStoreから削除する

      NSError *error;
      if(![eventStore removeReminder:reminder commit:YES error:&error])
        NSLog(@"%@", error);

EventStoreの保存領域から抹消するので、実行主体がEventStore、削除対象がEKReminderになる。

ちなみに完了は「更新」

リマインダ・アイテムを「完了」させる処理は「更新」と同じと考えられるので、更新処理として記述します。

リマインダのアイテムの更新

      reminder.completed=1;
      NSError *error;
      if(![eventStore saveReminder:reminder commit:YES error:&error])
        NSLog(@"%@", error);

EKReminderのプロパティcompletedに1 を代入し、その状態をSaveすることで達成できる。カンタンですね。

追加・一覧・削除・更新

ここまででCRUDを作ることが出来た。ひとまずここで終わりになると思ったのだけれど。。。

Reminders.app の動作を観察していると、作成したプログラムから追加削除するとReminders.appに即時反映されるわけです。これはイベントハンドラが動いているためだと思われます。

EventStoreのデータ更新イベントを取得し、取得済みリロードできれば更に便利なことが出来そうです。

最後にデータ更新のイベントハンドラを使う方法を調べてブログに残しておきたいと思います。

使うのはNSNotificationCenterです。iOSプログラマにはお馴染みのものです。

長くなったので、別エントリに書きます。

次回

NSNotificationCenterでEventStoreの更新の取得

⇐前(2) | まとめ | ⇒次(4)