Remove leading and trailing spaces
March 10, 2013 in iOS Snippets
Removing start and end spaces of an NSString is very simple:
NSString* result = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
March 10, 2013 in iOS Snippets
Removing start and end spaces of an NSString is very simple:
NSString* result = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
March 10, 2013 in iOS Snippets
This new idiom is concise and clean:
NSNumber* intNumber = @([str intValue]);
March 4, 2013 in iOS Snippets
Dispatches synchronously without deadlocking if the target thread is the current thread.
static inline void dispatch_sync2(dispatch_queue_t queue, dispatch_block_t block) {
if (dispatch_get_current_queue() == queue) {
block();
} else {
dispatch_sync(queue, block);
}
}
March 4, 2013 in iOS Snippets
Method 1, making a copy:
NSString* str = [mutableStr copy];
Method 2, also making a copy:
NSString* str = [NSString stringWithString:mutableStr];
Method 3, passing the original mutable string as an NSString by casting (almost never used):
NSString* immutableRefToMutableString = (NSString*)mutableStr;
February 27, 2013 in iOS Snippets
The following code simply fetches and deletes all objects of a given entity name – just remember to save the changes afterwards.
+ (void)deleteAllEntities:(NSString*)name inContext:(NSManagedObjectContext*)context;
{
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:name inManagedObjectContext:context]];
NSArray* fetchResult = [context executeFetchRequest:fetchRequest error:nil];
for (id obj in fetchResult) {
[context deleteObject:obj];
}
}
February 27, 2013 in iOS Snippets
A very common idiom:
if ([string length]) {
// It's a string of at least one char, and is not null.
}
Works because calling a method on nil is not an error – just silently returns nil, which is also false.
February 27, 2013 in iOS Snippets
As an iOS developer you’ll get to see this all the time, since you have to be enormously careful when running code that does any UI processing; such code must always run in the main (UI) thread, so when running on a different thread it’s necessary to pass a block of code to be executed by the main thread:
dispatch_async(dispatch_get_main_queue(), ^{
// ... code to execute in main thread ...
});
dispatch_async() will run that code right away, asynchronously – ie, it will not wait to queue the code into the main queue. Use dispatch_sync() if you want to wait until it’s done – but be careful! If you target the current queue, it will result in a deadlock. More information in the official documentation.
February 26, 2013 in iOS Snippets
For performance reasons we only create the formatter object once, and just reuse it afterwards. The formatter style can be easily tailored by duplicating the method and changing its options; we keep the method’s name as descriptive as possible of the conversion to be done. It is also a good idea to keep this in a category on NSString.
+ (NSString*)dateAsFullDateTime:(NSDate*)date;
{
static NSDateFormatter * formatter = nil;
if (formatter == nil) {
formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setTimeStyle:NSDateFormatterLongStyle];
[formatter setDoesRelativeDateFormatting:NO];
}
return [formatter stringFromDate:date];
}
February 26, 2013 in iOS Snippets
+ (NSString*)urlEncodeString:(NSString*)str;
{
return (__bridge_transfer NSString *)
CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)str, NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[ ]", kCFStringEncodingUTF8);
}
February 26, 2013 in iOS Snippets
The following is a correct thread-safe implementation of the singleton +sharedInstance method, which relies on GCD:
+ (id)sharedInstance;
{
static id sharedInstance = nil;
static dispatch_once_t once = 0;
dispatch_once(&once,
^{ sharedInstance = [[self alloc] init]; }
);
return sharedInstance;
}