Установка множественного неиспользуемого уведомления, запускающего только последнее уведомление

#objective-c #unusernotificationcenter #unusernotification

#objective-c #unusernotificationcenter #уведомление о неиспользовании

Вопрос:

РЕДАКТИРОВАТЬ: я устанавливаю ровно 365 локальных уведомлений UNUserNotification (по одному на каждый день в году). Кнопка вызывается одновременно:

 [self name1];
[self name2];
...
[self name365];
  
  • одно имя на каждый день. Если я попробую только, например, 3 дня, он работает отлично. Если я вызываю all days (365 раз), запускается только последнее локальное уведомление (365. только) — день 1-364 пропущен (не запущен). Есть идеи?

Код:

 -(void)Name1{
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    comps.hour = 9;
    comps.minute = 0;
    comps.day = 23;
    comps.month = 10;
 
    UNMutableNotificationContent *objNotificationContent = [[UNMutableNotificationContent alloc] init];
    objNotificationContent.title = [NSString localizedUserNotificationStringForKey:@"NAME" arguments:nil];
    objNotificationContent.body = [NSString localizedUserNotificationStringForKey:@"text"
                                                                        arguments:nil];
    objNotificationContent.sound = [UNNotificationSound soundNamed:@"notif_bobicek.mp3"];
    UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents: comps repeats:YES];
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"requestNotificationForName1"
                                                                          content:objNotificationContent trigger:trigger];
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
      if (!error) { NSLog(@"Local Notification succeeded"); }
      else { NSLog(@"Local Notification failed"); }}];
}
  

.

 -(void)Name2{ ... // same code
-(void)Name365{... // same code
  

Примечание: идентификатор отличается для каждого запланированного локального уведомления.

Комментарии:

1. Я думаю, вам следует попытаться добавить счетчик, а не иметь 365 повторяющихся фрагментов кода. Что, если вам нужно его изменить? Если у вас должно быть 365 кодов, попробуйте создать его, используя вместо #define . По крайней мере, вы можете изменить его только одним способом. Я не знаком с локальными уведомлениями, но, возможно, им нужны разные идентификаторы запросов?

Ответ №1:

Это не дает прямого ответа на ваш вопрос, и вам действительно следует параметризовать свой подход, но то, что я вам покажу, может вам очень помочь. Я хочу четко проиллюстрировать, что я имел в виду, используя #define в моем комментарии.

Использование #define — это мощный способ решить некоторые сложные проблемы, и даже здесь он может сделать вашу жизнь намного проще. Подумайте о #define как о типе поиска и замены, которым он буквально был раньше, и здесь вы можете использовать это, чтобы определить ваше сообщение ОДИН РАЗ, а затем заменить его 365 раз вместо создания 365 разных сообщений. Вот схема.

 // MyClass.m
#import "MyClass.h"

// The  indicates the macro continues on the next line
// Note this becomes just one long string without linebreaks so you can
// not use // to comment, you must use /* ... */ to comment
// The ## indicates it is a string concatenation
#define MYFUNC( DAY )                                           
- ( void ) name ## DAY {                                        
    /* Now you are inside nameDAY e.g. name1, name2 ... etc */  
    NSDateComponents *comps = [[NSDateComponents alloc] init];  
    comps.hour = 9;                                             
    comps.minute = 0;                                           
    comps.day = 23;                                             
    comps.month = 10;                                           
    /* Some examples below */                                   
    NSUInteger day = DAY;                                       
    NSString * s = [NSString stringWithFormat:@"ID:%lu", DAY];  
    NSLog( @"Inside %@", s );                                   
};

@implementation MyClass

// Now you can create them as below
MYFUNC( 1 )
MYFUNC( 2 )
MYFUNC( 3 )
MYFUNC( 4 )
// etc

// They are now defined and can be called as normal
- ( void ) test
{
    [self name1];
    [self name2];
    [self name3];
    // etc
}

@end
  

Если вы параметризуете свой подход, но вам все еще нужны 365 функций, вы можете, например, расширить #define, добавив дополнительные параметры. В любом случае, для получения дополнительной информации см. Эту действительно хорошую ссылку.

https://en.wikibooks.org/wiki/C_Programming/Preprocessor_directives_and_macros

ПРИВЕТ