Objective-C – Core Data entity to hold UILocalNotifications - objective-c

I want to be able to store a representation of UILocalNotifications in Core Data. So for my needs I need to save the fireDate of the UILocalNotification which should be easy as Core Data has support for NSDate. I also want to save a repeat interval for the UILocalNotification in the class reference it says that the repeatInterval type is NSCalendarUnit.
So how would I go about saving the repeatInterval?

According to the docs NSCalendarUnit is a typedef for NSUInteger. So in CoreData you would store that as a Integer 32 type. In your code you can access those properties as NSNumbers.
Use -[NSInteger unsignedIntegerValue] to get the original NSUInteger value.

From what I understand of the documentation, the NSCalendarUnit is just a NSUInteger, so you could store it as a NSNumber, right?

Related

Using NSDate category with Swift 3 Date type

I have an Obj-C category on NSDate and I am trying to use the functions in that category with Swift's Date structure.
Is there a clean way to do that without having to cast every time or having to create NSDate instance from Date or some ugly other hack?
Or am I stuck with having to define my objects as NSDate instead of Date?
Apple mentions here that
The Swift overlay to the Foundation framework provides the Date structure, which bridges to the NSDate class. The Date value type offers the same functionality as the NSDate reference type, and the two can be used interchangeably in Swift code that interacts with Objective-C APIs. This behavior is similar to how Swift bridges standard string, numeric, and collection types to their corresponding Foundation classes.
, so my question is how can I access the extra functions in my NSDate category with my Date objects with clean minimal code?
For reference, I am using Swift 3.
Swift's 3 bridged types are implemented via an internal reference to their corresponding Objective-C object. So, similar to the "composition over inheritance" principle, you can declare the methods you're interested in, in Swift, and simply forward the call.
For example, if you have the following method in Objective-C:
#interface NSDate(MyAdditions)
- (NSString*)myCustomNicellyFormattedDate;
#end
you could add an extension to Date that simply casts and forwards:
extension Date {
var myCustomNicellyFormattedDate: String {
return (self as NSDate).myCustomNicellyFormattedDate()
}
}
This approach has the advantage of having the method available in both Objective-C and Swift, with little overhead and maintenance troubles. And most important, without code duplication.

Access raw NSData for a Transformable attribute in Core Data

In my model, I have an attribute transformingString that stores an NSString object as NSData, using the "Transformable" type. In my code, I have an NSString as an dynamic property in my NSManagedObject, and accessing that property automatically invokes the value transformer to convert from NSData to NSString.
In some cases, though, I want to access the raw NSData in my code, without invoking the NSValueTransformer, so I can handle the NSData in a different way for some edge case. How can I do this? I don't think there is any way to just turn off the Transformable type for my Core Data model. I'm hoping there is some way to access the raw NSData directly that is passed into the transformer.
I've tried [self primitiveValueForKey: #"transformingString"] but that also invoked the NSValueTransformer and returns the NSString type. Is there a way to do this?
If i resume you want access a value on a NSManagedObject that is not stored in persistent Store. I suggest you to add a category on your NSManagedObject. In this category declare a property in readonly (for be sure that not use for an other thing). In the implementation return the raw NSData.

How to have NSData in an object that will be converted with NSJSONSerialization?

I have a NSMutableArray with custom objects. The objects inside have a NSData field. I want to transport them to my web service using JSON format but I don't really know how to do it with NSJSONSerialization as it doesn't support NSData. Can you tell me if it's possible and provide me with some sample code or some other library that can handle this?
No. As the NSJSONSerialization documentation makes clear:
An object that may be converted to JSON must have the following properties:
The top level object is an NSArray or NSDictionary.
All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull.
All dictionary keys are instances of NSString.
Numbers are not NaN or infinity.
NSData obviously doesn't have those properties.
So likely what you'll want to do is encode it as a Base64 string or some other form you consider acceptable (there are plenty of options other than Base64, but it's the one that immediately comes to mind). You might also be able to get by with just converting it to a string (depending on what the data is) that uses the appropriate escape codes and so on, though you should make sure that won't result in any encoding issues.
Anyway, the answer's no. Find a way to encode it as an NSString or something else NSJSONSerialization can work with.

How to add an NSEvent to a Property List?

I'd like to encode an NSEvent using NSPropertyListSerialization, but NSPropertyListSerialization only accepts NSData, NSString, NSArray, NSDictionary, NSDate, and NSNumber objects.
Is there a recommended way to convert an NSEvent to a NSPropertyListSerialization-capable NSDictionary (and to restore an NSEvent from such an NSDictionary)?
In this situation you need to handle saving and restoring the object yourself. Or rather, the pieces of the object you're interested in, either by putting each value in an NSDictionary or storing them separately and using the values to create a new object when your class is decoded.
This situation is a little weird since you usually don't create or store NSEvent objects. If you're doing something like storing the last touch coordinate, consider using an CGPoint instead. Not only will you reduce your memory footprint by a small amount, but you can then use an NSValue to serialize the point.

NSUserDefaultsProblem

I have a simple problem:
I add an object to an NSArray, then I add an object to it then I use the NSUserDefaults way to save the array, but it doesn't work, I mean the array isn't saved and the console sends me this messange:
2011-03-21 23:09:53.994 Project[10490:207] * -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '(
""
)' of class '__NSArrayM'.
does anybody know how can I fix this.
NSUserDefaults only allows you to save basic lightweight objects; for example NSString, NSNumber and NSData. If you want to add another class, you'll have to shoehorn it into an NSData object beforehand. This is pretty simple, usually just a call to [NSKeyedArchiver archivedDataWithRootObject:array];. Note that the objects in the array must implement the NSCoding protocol, which you'll have to add to any of your own custom classes if that's what you want to save.
Also keep in mind NSUserDefaults is meant for lightweight preferences, not application data. If you have a large array of objects, you might be better served by archiving it to its own file or using Core Data (if you feel comfortable using something a little more advanced).
The only types you can save in NSUserDefaults are property list types: NSString, NSDate, NSArray, NSDictionary, NSNumber, NSData. You're probably trying to save an array of objects that aren't one of these types.