Skip to content

Instantly share code, notes, and snippets.

View alanf's full-sized avatar

Alan Fineberg alanf

View GitHub Profile
class FakeRecorder: BreadcrumbRecordable {
var testRecords: [Data] = []
func saveRecord(_ data: Data!, streamName: String!) -> AWSTask<AnyObject>! {
testRecords.append(data)
return AWSTask()
}
func submitAllRecords() -> AWSTask<AnyObject>! {
return AWSTask()
protocol BreadcrumbRecordable {
func saveRecord(_ data: Data!, streamName: String!) -> AWSTask<AnyObject>!
func submitAllRecords() -> AWSTask<AnyObject>!
}
extension AWSFirehoseRecorder: BreadcrumbRecordable {
}
class BreadcrumbLogger {
private let recorder: AWSFirehoseRecorder
init(recorder: AWSFirehoseRecorder = AWSFirehoseRecorder.default()) {
self.recorder = recorder
}
private func breadcrumbDictionary(breadcrumb: Breadcrumb) -> Dictionary<String, AnyObject?> {
let breadcrumbDictionary: Dictionary<String, AnyObject?> = [
class FakeRecorder: AWSFirehoseRecorder {
var testRecords: [Data] = []
override func saveRecord(_ data: Data!, streamName: String!) -> AWSTask<AnyObject>! {
testRecords.append(data)
return AWSTask()
}
override func submitAllRecords() -> AWSTask<AnyObject>! {
return AWSTask()
class BreadcrumbLogger {
let recorder = AWSFirehoseRecorder.default()
private func breadcrumbDictionary(breadcrumb: Breadcrumb) -> Dictionary<String, AnyObject?> {
let breadcrumbDictionary: Dictionary<String, AnyObject?> = [
/* snip */
:]
return breadcrumbDictionary
}
@alanf
alanf / ViewControllerMemoryLeak.swift
Last active January 20, 2017 23:48
Illustrates a specific type of retain cycle
/// Schedules a timer on a queue when the view is loaded.
/// Also logs when deinit is invoked
class ViewControllerBase: UIViewController {
let timer:DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue(label: "q.q"))
deinit {
NSLog("deinit of \(NSStringFromClass(type(of: self)))")
}
override func viewDidLoad() {
if let item = extensionContext?.inputItems.first as? NSExtensionItem,
let provider = item.attachments?.first as? NSItemProvider,
provider.hasItemConformingToTypeIdentifier("public.url") {
provider.loadItem(forTypeIdentifier: "public.url", options: nil) { (coder, error) in
let url = coder as? URL
NSLog("\(url)")
}
}
@alanf
alanf / LiveInstanceTracking.m
Last active April 26, 2016 20:21
An example of how to track / count live instances of a particular class.
@implementation LiveInstanceTracking
static NSHashTable *instances;
- (instancetype)init {
self = [super init];
if (self) {
if (!instances) {
instances = [[NSHashTable alloc] initWithOptions:NSHashTableWeakMemory capacity:1000];
}
@alanf
alanf / LockingExcerpt.m
Last active April 26, 2016 04:59
Excerpt of code called from deadlocking test
- (void)lockWithCompletionBlock:(dispatch_block_t)completionBlock {
@synchronized(_lockSempahore) {
if (!self.locked) {
self.locked = YES;
[[NSOperationQueue mainQueue] addOperationWithBlock:completionBlock];
return;
}
[self.blocksWaitingOnLockAcquisition addObject:completionBlock];
}
@alanf
alanf / ProblemTest.m
Last active April 26, 2016 20:14
Deadlocking Test
- (void)test_thatDeadlocks_whenRunAsPartOfALargerSuite {
SQRTransaction *transation = [self.testFixture createNewTransactionAndSaveContext];
SQOTOpenTicket *associatedOpenTicket = [transaction.cart.openTicket SQOT_associatedOpenTicket];
// ...verify setup...
XCTestExpectation *completionHandlerExpectation = [self expectationWithDescription:@"Completion handler called"];
[self.openTicketsBroker lockOpenTicketForUserInteraction:associatedOpenTicket withCompletionBlock:^{
// ...
[completionHandlerExpectation fulfill];
}];