代码之家  ›  专栏  ›  技术社区  ›  Jeremy Mullin

我可以将uilocalnotifications数组写入磁盘吗?

  •  0
  • Jeremy Mullin  · 技术社区  · 14 年前

    我正在尝试使用以下代码来持久化本地通知的当前列表。nsarray明确列出了它将使用的对象的类型,这意味着我不能将它与一个装满uilocalnotification对象的数组一起使用。但是,uilocalnotifications确实实现了nscoding,这让我相信必须有一种简单的方法来序列化/反序列化这个对象列表。我需要自己做编码和文件持久性吗?另外,有没有一种方法可以获得有关写入失败原因的更多信息?

    - (NSString*)getSavedNotifsPath {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
    
        return [documentsDirectory stringByAppendingString:@"saved_notifs.plist"];
    }
    
    - (void)prepareToHide {
    UIApplication* app = [UIApplication sharedApplication];
    NSArray *existingNotifications = [app scheduledLocalNotifications];
    if (! [existingNotifications writeToFile:[self getSavedNotifsPath] atomically:NO] ) {
        // alert
        [self showSomething:@"write failed"];
    }
    }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Kirby T    14 年前

    首先,更改代码

    return [documentsDirectory stringByAppendingString:@"saved_notifs.plist"];
    

    return [documentsDirectory stringByAppendingPathComponent:@"saved_notifs.plist"];
    

    StringByAppendingPathComponent:将确保在文件名之前包含斜杠(/)。

    nsarray只能保存属性列表对象,而uilocalnotification不能保存。相反,尝试使用nskeyedarchive。例如:

    - (void)prepareToHide {
       UIApplication* app = [UIApplication sharedApplication];
       NSArray *existingNotifications = [app scheduledLocalNotifications];
       NSString *path = [self getSavedNotifsPath];
       BOOL success = [NSKeyedArchiver archiveRootObject:existingNotifications toFile:path];
       if (! success ) {
          // alert
          [self showSomething:@"write failed"];
       }
    }
    

    使用nskeyedunarchiver从保存的文件中检索数组。

    注:我还没有真正测试过这个,所以我不能百分之百地肯定它会起作用。但是试试看会发生什么。