Skip to content

Instantly share code, notes, and snippets.

View ManWithBear's full-sized avatar
🐻
Bear with it

Denis Bogomolov ManWithBear

🐻
Bear with it
View GitHub Profile
@ManWithBear
ManWithBear / libdispatch-efficiency-tips.md
Created January 23, 2023 23:15 — forked from tclementdev/libdispatch-efficiency-tips.md
Making efficient use of the libdispatch (GCD)

libdispatch efficiency tips

The libdispatch is one of the most misused API due to the way it was presented to us when it was introduced and for many years after that, and due to the confusing documentation and API. This page is a compilation of important things to know if you're going to use this library. Many references are available at the end of this document pointing to comments from Apple's very own libdispatch maintainer (Pierre Habouzit).

My take-aways are:

  • You should create very few, long-lived, well-defined queues. These queues should be seen as execution contexts in your program (gui, background work, ...) that benefit from executing in parallel. An important thing to note is that if these queues are all active at once, you will get as many threads running. In most apps, you probably do not need to create more than 3 or 4 queues.

  • Go serial first, and as you find performance bottle necks, measure why, and if concurrency helps, apply with care, always validating under system pressure. Reuse

#!/bin/zsh
# For each framework in current folder list all imported frameworks.
# `find_imports_directories_to_skip.txt` contains list of directories to ignore (e.g. xcodeproj)
# `find_imports_imports_to_skip.txt` contains list of imported frameworks that should be removed from output (e.g. UIKit)
DIRECTORIES_TO_SKIP=$(cat find_imports_directories_to_skip.txt)
for FORFramework in $(ls -d -- */) # itterate over all directories in current folder
do
if [[ $DIRECTORIES_TO_SKIP =~ "${FORFramework}" ]]; then
//
// Copyright © 2017 Square, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
@ManWithBear
ManWithBear / projectInfo.stencil
Created December 3, 2019 15:27
Collect information about data types in project using Sourcery
enums {{ types.enums.count }}
protocols {{ types.protocols.count }}
classes {{ types.classes.count }}
structs {{ types.structs.count }}
@ManWithBear
ManWithBear / add_record_flag.sh
Created October 8, 2019 08:02
Adds -record command line argument to test run in Xcode.
#!/bin/bash
# Add -record flag to iOSUITests test run
# By default run all tests. If test name passed as argument, run tests only for this testcase
# setup destinations
export currentDirectory="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# Name of simulators to run tests on
@ManWithBear
ManWithBear / Runtime_tests.md
Created October 7, 2019 14:30
How to create runtime tests in swift

You probably can't do it in pure swift since NSInvocation is not part of swift api anymore.

XCTest rely on + (NSArray<NSInvocation *> *)testInvocations function to get list of test methods inside one XCTestCase class. Default implementation as you can assume just find all methods that starts with test prefix and return them wrapped in NSInvocation. (You could read more about NSInvocation here)
So if we want to have tests declared in runtime, this is point of interest for us.
Unfortunately NSInvocation is not part of swift api anymore and we cannot override this method.

If you OK to use little bit of ObjC then we can create super class that hide NSInvocation details inside and provide swift-friendly api for subclasses.

/// Parent.h
@ManWithBear
ManWithBear / flat_folders.sh
Created September 4, 2019 08:32
Recursively move files from subfolders to current folder
Transforms:
./Notification/Black@2x.png
./Notification/Black.png
./Sign out/Black.png
./Sign out/Black@2x.png
To:
.Notification_Black@2x.png
.Notification_Black.png
.Sign out_Black.png
.Sign out_Black@2x.png
@ManWithBear
ManWithBear / Notes.md
Created May 28, 2019 09:28
iOS Dev notes
@ManWithBear
ManWithBear / ReusableXibView.swift
Created November 22, 2018 12:10
Smarty way to init xib views inside other xibs
import UIKit
/// thanks to Badoo
/// https://github.com/badoo/Chatto/blob/master/ChattoAdditions/Source/Input/ReusableXibView.swift
@objc open class ReusableXibView: UIView {
func loadViewFromNib() -> UIView {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: type(of: self).nibName(), bundle: bundle)
let view = nib.instantiate(withOwner: nil, options: nil).first as! UIView
@ManWithBear
ManWithBear / create_simulators
Last active January 17, 2022 15:18
Create my simulators setup
#!/bin/bash
xcrun simctl delete $(xcrun simctl list | grep -o '[0-9A-F]\{8\}-[0-9A-F]\{4\}-[0-9A-F]\{4\}-[0-9A-F]\{4\}-[0-9A-F]\{12\}' | xargs)
xcrun simctl delete unavailable
runtime="com.apple.CoreSimulator.SimRuntime.iOS-12-2"
xcrun simctl create "1. Monday (X)" com.apple.CoreSimulator.SimDeviceType.iPhone-X $runtime
xcrun simctl create "2. Tuesday (Air 2)" com.apple.CoreSimulator.SimDeviceType.iPad-Air-2 $runtime
xcrun simctl create "3. Wednesday (8)" com.apple.CoreSimulator.SimDeviceType.iPhone-8 $runtime
xcrun simctl create "4. Thursday (8 Plus)" com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus $runtime
xcrun simctl create "5. Friday (SE)" com.apple.CoreSimulator.SimDeviceType.iPhone-SE $runtime