<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mike Zornek</title>
    <link>https://mikezornek.com/tags/ios/</link>
    <description>Recent content in ios on Mike Zornek</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>mike@mikezornek.com (Mike Zornek)</managingEditor>
    <webMaster>mike@mikezornek.com (Mike Zornek)</webMaster>
    <lastBuildDate>Wed, 02 Sep 2020 10:42:44 -0400</lastBuildDate>
    
	<atom:link href="https://mikezornek.com/tags/ios/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Video: Using Fixtures and Test Assets in Swift Unit Tests (9m)</title>
      <link>https://mikezornek.com/posts/2020/9/using-fixtures-and-test-assets-in-swift-unit-tests/</link>
      <pubDate>Wed, 02 Sep 2020 10:42:44 -0400</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2020/9/using-fixtures-and-test-assets-in-swift-unit-tests/</guid>
      <description>&lt;p&gt;In today&amp;rsquo;s video I&amp;rsquo;ll demonstrate how you can use the concept of fixtures in your Swift unit tests to quickly build business objects and validate scenarios.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll also show how you can add assets to a test target and then access them in code using &lt;code&gt;Bundle(for: SomeTypeInTheTestBundle.self)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The code you see in the video is part of a demo project on GitHub:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/zorn/VersionedFilesDemo&#34;&gt;https://github.com/zorn/VersionedFilesDemo&lt;/a&gt;&lt;/p&gt;





&lt;video
  controls
  class=&#34;mb-0 w-full&#34;
  title=&#34;Using Fixtures and Test Assets in Swift Unit Tests&#34;
&gt;
  &lt;source src=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/using_fixtures_and_test_assets_in_swift_unit_tests.mp4&#34; type=&#34;video/mp4&#34;&gt;
  Your browser does not seem to support the video format. You can
  &lt;a href=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/using_fixtures_and_test_assets_in_swift_unit_tests.mp4&#34;&gt;download the MP4 file&lt;/a&gt;
  directly.
&lt;/video&gt;

&lt;div class=&#34;mt-2 flex justify-between&#34;&gt;
  &lt;a href=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/using_fixtures_and_test_assets_in_swift_unit_tests.mp4&#34;&gt;Download MP4&lt;/a&gt;
  
    &lt;a href=&#34;https://www.youtube.com/watch?v=VVdwOnBiWlU&#34;&gt;Watch on YouTube&lt;/a&gt;
  
&lt;/div&gt;

&lt;p&gt;Thanks for watching!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Migrating JSON File Schema Changes in Swift</title>
      <link>https://mikezornek.com/posts/2020/9/migrating-json-file-schema-changes-in-swift/</link>
      <pubDate>Tue, 01 Sep 2020 11:26:25 -0400</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2020/9/migrating-json-file-schema-changes-in-swift/</guid>
      <description>&lt;p&gt;As part of my &lt;a href=&#34;https://mikezornek.com/posts/2020/8/bartering-with-other-developers-on-side-projects/&#34;&gt;side project bartering&lt;/a&gt;, I&amp;rsquo;ve build a simple open source Xcode project that demonstrate how you could save your Swift app&amp;rsquo;s storage as a simple JSON file and then migrate the file schema changes over time. This is particularly useful when you have users generating data and documents in beta builds while the app internals are changing a lot.&lt;/p&gt;
&lt;p&gt;The code is in written in Swift and is utilizing a Xcode 12-specific SwiftUI project, though the core ideas are general purpose.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/zorn/VersionedFilesDemo&#34;&gt;https://github.com/zorn/VersionedFilesDemo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Video walk through:&lt;/p&gt;





&lt;video
  controls
  class=&#34;mb-0 w-full&#34;
  title=&#34;Migrating JSON File Schema Changes in Swift&#34;
&gt;
  &lt;source src=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/migrating_json_file_schema_changes_in_swift.mp4&#34; type=&#34;video/mp4&#34;&gt;
  Your browser does not seem to support the video format. You can
  &lt;a href=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/migrating_json_file_schema_changes_in_swift.mp4&#34;&gt;download the MP4 file&lt;/a&gt;
  directly.
&lt;/video&gt;

&lt;div class=&#34;mt-2 flex justify-between&#34;&gt;
  &lt;a href=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/migrating_json_file_schema_changes_in_swift.mp4&#34;&gt;Download MP4&lt;/a&gt;
  
    &lt;a href=&#34;https://www.youtube.com/watch?v=VUc_7E2w5jc&#34;&gt;Watch on YouTube&lt;/a&gt;
  
&lt;/div&gt;

</description>
    </item>
    
    <item>
      <title>On the Topic of Mac OS X Sheets (Video 4m)</title>
      <link>https://mikezornek.com/posts/2020/6/on-the-topic-of-mac-os-x-sheets/</link>
      <pubDate>Mon, 22 Jun 2020 21:12:24 -0400</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2020/6/on-the-topic-of-mac-os-x-sheets/</guid>
      <description>&lt;p&gt;A short little WWDC reaction video that talks about Mac OS X and sheets.&lt;/p&gt;
&lt;iframe src=&#34;https://player.vimeo.com/video/431654557&#34; width=&#34;640&#34; height=&#34;360&#34; frameborder=&#34;0&#34; allow=&#34;autoplay; fullscreen&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;☠️ RIP Aqua&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;aqua.jpeg&#34; alt=&#34;Aqua Button&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;links&#34;&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=OEU7SOs0mNg&amp;amp;t=405s&#34;&gt;Steve Jobs Aqua Introduction&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>How Much Does It Cost to Build an iOS App?</title>
      <link>https://mikezornek.com/posts/2020/5/how-much-does-it-cost-to-build-an-ios-app/</link>
      <pubDate>Sun, 17 May 2020 16:26:38 -0400</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2020/5/how-much-does-it-cost-to-build-an-ios-app/</guid>
      <description>&lt;p&gt;As I take prospective client calls, particularly for those clients looking to build a new iOS app from scratch, the big question ultimately is raised:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How much does it cost to build an iOS app?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think &lt;a href=&#34;https://savvyapps.com/blog/how-much-does-app-cost-massive-review-pricing-budget-considerations&#34;&gt;Ken Yarmosh&amp;rsquo;s summary&lt;/a&gt; hits the nail on the head:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip; most quality apps cost between $100,000 to $1,000,000. Some apps will be less and some more. If you&amp;rsquo;re looking for an app built with great design, superior development, and clever marketing though, it will be somewhere in that range.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I highly encourage you to read that article to learn more. You should also check out &lt;a href=&#34;https://pragprog.com/book/rjnsd/the-nature-of-software-development&#34;&gt;The Nature of Software Development by Ron Jeffries&lt;/a&gt; which is a great, short and visual book on the topic (not specifically of costs, but of quality project development practices).&lt;/p&gt;
&lt;p&gt;More Links:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://savvyapps.com/blog/app-development-costs&#34;&gt;Ken Yarmosh: App Budget by App Type&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.entrepreneur.com/article/288027&#34;&gt;Entrepreneur: The Real Costs of Building a Mobile App for iOS and Android &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://stackoverflow.com/questions/209170/how-much-does-it-cost-to-develop-an-iphone-application/3926493#3926493&#34;&gt;Craig Hockenberry: how much it would cost to build Twitterrific&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ll also share my own notes, which I captured today in &lt;a href=&#34;https://mindnode.com/&#34;&gt;MindNode&lt;/a&gt; to help me through these phone calls.&lt;/p&gt;
&lt;p&gt;The notes are published below in a few open formats. Hopefully this helps. If you have any questions or want to talk about your own project, please &lt;a href=&#34;https://mikezornek.com/contact/&#34;&gt;contact me&lt;/a&gt;. Thanks!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;how-much-does-it-cost-to-build-an-ios-app.mindnode.zip&#34;&gt;MindNode document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;how-much-does-it-cost-to-build-an-ios-app.pdf&#34;&gt;PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;thumb.png&#34;&gt;PNG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&#34;thumb.png&#34;&gt;&lt;img src=&#34;thumb.png&#34; alt=&#34;MindNode Notes on How Much Does It Cost to Build an iOS App?&#34;&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Swift UInt vs Int</title>
      <link>https://mikezornek.com/posts/2020/4/swift-uint-vs-int/</link>
      <pubDate>Thu, 09 Apr 2020 15:23:36 -0400</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2020/4/swift-uint-vs-int/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m giving major consideration to utilizing Swift&amp;rsquo;s &lt;code&gt;UInt&lt;/code&gt; type for function returns and calculated properties in the future.&lt;/p&gt;
&lt;p&gt;Yes this does burden the user of my code or SDK to do the occasional type conversion, which is the only reason I&amp;rsquo;ve ever heard why the community uses &lt;code&gt;Int&lt;/code&gt; even for variables that should not be negative, but I think the expressiveness outweighs the negative of more code.&lt;/p&gt;
&lt;p&gt;I generally like to fall in line with the community when it comes to coding standards to help my code &amp;ldquo;fit in&amp;rdquo; but this issue has bothered me since day one of learning Swift. Would love to hear some feedback on this from experienced Swift developers.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Code Consistency with SwiftLint</title>
      <link>https://mikezornek.com/posts/2019/1/professional-ios-projects-code-consistency-with-swiftlint/</link>
      <pubDate>Thu, 24 Jan 2019 12:00:00 -0500</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2019/1/professional-ios-projects-code-consistency-with-swiftlint/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is part of a series, &lt;a href=&#34;https://mikezornek.com/professional-ios-projects/&#34;&gt;Professional iOS Projects&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img src=&#34;book-cover.jpg&#34; style=&#34;float: right; width: 300px;&#34; alt=&#34;Book Cover: Writing Code No One Else Can Read&#34; data-action=&#34;zoom&#34;&gt;
&lt;p&gt;Have you ever opened a source file and knew instantly it was written by a specific member of the team because of all the curious syntax choices they made? Perhaps they are green and don’t know the community standards or perhaps they spend most of their days in another language which has its own preferred style. What do you do?&lt;/p&gt;
&lt;p&gt;Many programmers would agree at a certain level of maturity we look for code consistency in our own work and in our group projects. However manually enforcing a style guide is extremely tedious, error prone and can get personal real quick. The solution is to find tools that automate a community standard and let them enforce if not generate the code patterns for us.&lt;/p&gt;
&lt;p&gt;In this post we’ll introduce and demonstrate one such tool for Swift iOS developers called &lt;a href=&#34;https://github.com/realm/SwiftLint&#34;&gt;SwiftLint&lt;/a&gt;. Its a great first step into a world of consistent code and easy to get integrated into your Xcode project.&lt;/p&gt;
&lt;h2 id=&#34;what-is-swiftlint&#34;&gt;What is SwiftLint?&lt;/h2&gt;
&lt;p&gt;Wikipedia &lt;a href=&#34;https://en.wikipedia.org/wiki/Lint_(software)&#34;&gt;describes a linter&lt;/a&gt; as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lint, or a linter, is a tool that analyze source code to flag programming errors, bugs, stylistic errors, and suspicious constructs. The term originates from a Unix utility that examined C language source code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/realm/SwiftLint&#34;&gt;SwiftLint&lt;/a&gt; is a tool that can scan your Swift code files and generate a list of warnings and errors based on a community provided collection of rules. It has great Xcode integration and online documentation.&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;
&lt;p&gt;There are a few different ways to install SwiftLint. I’ll review the &lt;a href=&#34;https://brew.sh/&#34;&gt;Homebrew&lt;/a&gt; method as it is the one I prefer. Assuming you have Homebrew already installed, run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install swiftlint
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will install a command line tool called &lt;code&gt;swiftlint&lt;/code&gt; and while you can use it from the command line most will want to integrate it with their Xcode project. To do so, you’ll want to add a new Build Phase for your main app target, specifically a Run Script Phase at the end, and insert the following code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; which swiftlint &amp;gt;/dev/null; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  swiftlint
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;
&lt;img src=&#34;xcode-build-phase.png&#34; alt=&#34;Xcode Build Phase Editor&#34; data-action=&#34;zoom&#34;&gt;
&lt;figcaption&gt;Xcode Build Phase Editor&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This script will look for the &lt;code&gt;swiftlint&lt;/code&gt; command line tool. If found, it will run it on your project&amp;rsquo;s source files. If not found, it will still allow the build to finish but will post a short message to the console.&lt;/p&gt;
&lt;h2 id=&#34;swiftlint-in-action&#34;&gt;SwiftLint In Action&lt;/h2&gt;
&lt;p&gt;With &lt;code&gt;swiftlint&lt;/code&gt; installed and your Xcode project setup, you now will experience new inline warnings and errors, helping to identify code that might lean away from community standards. Sometimes the warnings or errors will even offer automated fix options too.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;xcode-editor.png&#34; alt=&#34;Warnings and Errors in Xcode Editor&#34; data-action=&#34;zoom&#34;&gt;
&lt;figcaption&gt;Warnings and Errors in Xcode Editor&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&#34;customizing-the-rules&#34;&gt;Customizing the Rules&lt;/h2&gt;
&lt;p&gt;Out of the box &lt;code&gt;swiftlint&lt;/code&gt; will enforce a small subset of the 166 (and growing) rule collection. You can however customize the rules you want to enforce on your project by adding a &lt;code&gt;.swiftlint.yml&lt;/code&gt; configuration file to the root of your project. Here you can explicitly opt in or disable rules. You can also configure file paths to exclude from rule matching (like &lt;code&gt;Pods&lt;/code&gt; or &lt;code&gt;Carthage&lt;/code&gt;). You can even configure some rules, defining the thresholds you want to be held accountable to (think file line size or method line size). More details on this configuration is in the &lt;a href=&#34;https://github.com/realm/SwiftLint/blob/master/README.md&#34;&gt;SwiftLint README&lt;/a&gt;. A &lt;a href=&#34;https://github.com/realm/SwiftLint/blob/master/Rules.md&#34;&gt;full list of Rules&lt;/a&gt; is also well documented.&lt;/p&gt;
&lt;p&gt;If you want to turn a rule off for individual occurrences, check out the inline &lt;code&gt;disable&lt;/code&gt; and &lt;code&gt;enable&lt;/code&gt; options:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// swiftlint:disable colon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; noWarning :String = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// No warning about colons immediately after variable names!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// swiftlint:enable colon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; hasWarning :String = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// Warning generated about colons immediately after variable names&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Personally I recommend turning on all the rules to get started. If you have a previous code base this will probably result in hundreds of warnings and errors but you can easily filter these errors in Xcode to see them, one by one.&lt;/p&gt;
&lt;p&gt;When I first started using SwiftLint in a larger project, I did this rule by rule, either fixing the code issues and committing the changes or adding the rule to the disabled list. It took a few hours but was a great way to learn what people considered good standards.&lt;/p&gt;
&lt;h2 id=&#34;related-projects&#34;&gt;Related Projects&lt;/h2&gt;
&lt;p&gt;SwiftLint has been my personal go-to tool of choice but if you want to compare some related projects checkout:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/sleekbyte/tailor&#34;&gt;GitHub - sleekbyte/tailor: Cross-platform static analyzer and linter for Swift.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/nicklockwood/SwiftFormat&#34;&gt;GitHub - nicklockwood/SwiftFormat: A code library and command-line formatting tool for reformatting Swift code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Jintin/Swimat&#34;&gt;GitHub - Jintin/Swimat: An Xcode formatter plug-in to format your swift code.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/oclint/oclint&#34;&gt;GitHub - oclint/oclint: A static source code analysis tool to improve quality and reduce defects for C, C++ and Objective-C&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/realm/SwiftLint&#34;&gt;SwiftLint&lt;/a&gt; is a easy to install and configure tool that helps you add some code consistency to your Swift Xcode projects. It helps you avoid manual style checks during code reviews leaving more time to focus on actual code quality.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Designing a Modern Swift Network Stack, Video and Slides</title>
      <link>https://mikezornek.com/posts/2019/1/designing-a-modern-swift-network-stack-video-and-slides/</link>
      <pubDate>Tue, 15 Jan 2019 15:00:00 -0500</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2019/1/designing-a-modern-swift-network-stack-video-and-slides/</guid>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE 1.16:&lt;/strong&gt; Fixed some slide typos (didn&amp;rsquo;t bother to edit video). If you spot anymore, &lt;a href=&#34;https://mikezornek.com/contact&#34;&gt;let me know&lt;/a&gt;. Thanks!&lt;/p&gt;
&lt;p&gt;I had a great time doing this networking design talk for the local &lt;a href=&#34;http://phillycocoa.org/&#34;&gt;Philly CocoaHeads&lt;/a&gt;. If you watch the video and have feedback, I&amp;rsquo;d love to &lt;a href=&#34;https://mikezornek.com/contact&#34;&gt;hear it&lt;/a&gt; as I may revamp this talk for a 2.0 version in the future.&lt;/p&gt;
&lt;iframe src=&#34;https://player.vimeo.com/video/311520171&#34; width=&#34;640&#34; height=&#34;360&#34; frameborder=&#34;0&#34; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://vimeo.com/311520171&#34;&gt;Video on Vimeo&lt;/a&gt; 44 minutes&lt;/li&gt;
&lt;li&gt;Slides &lt;a href=&#34;modern-ios-network-zornek-slides.pdf&#34;&gt;PDF&lt;/a&gt; / &lt;a href=&#34;https://speakerdeck.com/zorn/designing-a-modern-swift-network-stack&#34;&gt;SpeakerDeck&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;designing-a-modern-swift-network-stack&#34;&gt;Designing a Modern Swift Network Stack&lt;/h1&gt;
&lt;p&gt;When an app is young and has simple networking needs it&amp;rsquo;s not uncommon to use URLSession tasks directly inside of a view controller. However as the app needs grow to include things like authenticated requests, token renewal, testing, cancellation, caching and more &amp;ndash; you&amp;rsquo;ll want to have a more defined networking stack to lean on. On a client project over the summer, the iOS team and I started to document a networking wish list and over the past few months we&amp;rsquo;ve started to execute it, first on some smaller features and a demos app. Now we are preparing for a new greenfield iOS app where we should be able to hit the ground running with our new ideas.&lt;/p&gt;
&lt;p&gt;In this talk I&amp;rsquo;ll review the network design we&amp;rsquo;ve come up with. I&amp;rsquo;ll demo what we have working and talk about how we want to extend it in the future. Attendee should walk away with new ideas that they can integrate into their own networking stacks.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;highres_477725961.jpeg&#34; alt=&#34;Philly CocoaHeads, Mike Zornek&#34; data-action=&#34;zoom&#34;&gt;
&lt;figcaption&gt;Philly CocoaHeads, Mike Zornek&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;highres_477725960.jpeg&#34; alt=&#34;Philly CocoaHeads, Group Shot&#34; data-action=&#34;zoom&#34;&gt;
&lt;figcaption&gt;Philly CocoaHeads, Group Shot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;highres_477725968.jpeg&#34; alt=&#34;Philly CocoaHeads, Slopes&#34; data-action=&#34;zoom&#34;&gt;
&lt;figcaption&gt;Philly CocoaHeads, Slopes&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;highres_477725971.jpeg&#34; alt=&#34;Philly CocoaHeads, Group Shot&#34; data-action=&#34;zoom&#34;&gt;
&lt;figcaption&gt;Philly CocoaHeads, Group Shot&lt;/figcaption&gt;
&lt;/figure&gt;
</description>
    </item>
    
    <item>
      <title>New Series: Professional iOS Projects</title>
      <link>https://mikezornek.com/posts/2019/1/new-series-professional-ios-projects/</link>
      <pubDate>Tue, 08 Jan 2019 12:40:03 -0500</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2019/1/new-series-professional-ios-projects/</guid>
      <description>&lt;p&gt;One of the lessons learned from &lt;a href=&#34;https://pragprog.com/book/tpp/the-pragmatic-programmer&#34;&gt;The Pragmatic Programmer&lt;/a&gt; by Andrew Hunt and David Thomas is to &lt;strong&gt;learn a new language every year&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut. Additionally, learning many languages is far easier now, thanks to the wealth of freely available software on the Internet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Over the last few years I’ve really tried to take this to heart and have worked with and dabbled in lots of languages, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Objective-C&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Elm&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Elixir&lt;/li&gt;
&lt;li&gt;Swift&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…and related frameworks/tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ember&lt;/li&gt;
&lt;li&gt;ReactJS&lt;/li&gt;
&lt;li&gt;Rails&lt;/li&gt;
&lt;li&gt;Phoenix&lt;/li&gt;
&lt;li&gt;GraphQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With that context, one of the biggest issues I have with iOS development is that &lt;strong&gt;our projects, as a community, lack professional consistency&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you open a project in any of the frameworks I mentioned above you’ll find very specific places for each piece of the codebase; you’ll find code generators that follow these patterns for new files and tests; you’ll find community accepting tooling standards for bringing it all together. This consistency takes a whole world of questions and decisions off the table making your development life so much easier.&lt;/p&gt;
&lt;p&gt;On iOS, every Xcode project is its own unique beast. There are some patterns we get from UIKit but it only gets us so far.&lt;/p&gt;
&lt;p&gt;I feel like Apple has dropped the ball. In my opinion, Xcode should have more opinionated and structured project templates to offer. It should have open integration to third-party project templates to easily allow the community to drive us forward. Following “good practices” like migrating code to frameworks, should be easier. Testing should be more streamlined. Failure to add inline documentation should cause warnings. I can go on and on, and I will.&lt;/p&gt;
&lt;p&gt;“Professional iOS Projects” is a new blog series where I want to explore what we can do to improve our iOS projects. Apple of course drives us with its closed-sourced, time limited Xcode release schedule, but there is plenty we can work on ourselves, from lint tools to documentation, testing, folder structure, system design and more. It’s a series that could go on forever. 😱&lt;/p&gt;
&lt;p&gt;The first post is ready. It’s all about &lt;a href=&#34;https://mikezornek.com/posts/2019/1/professional-ios-projects-the-readme-file/&#34;&gt;the README file&lt;/a&gt;. Please check it out and &lt;a href=&#34;https://mikezornek.com/contact&#34;&gt;let me know&lt;/a&gt; what you think. I also welcome topic ideas for future articles.&lt;/p&gt;
&lt;p&gt;Going to shoot for a weekly release schedule so grab that &lt;a href=&#34;https://mikezornek.com/index.xml&#34;&gt;RSS feed&lt;/a&gt; and join me.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Network Design Talk at Philly CocoaHeads</title>
      <link>https://mikezornek.com/posts/2019/1/network-design-talk-at-philly-cocoaheads/</link>
      <pubDate>Thu, 03 Jan 2019 10:25:00 -0500</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2019/1/network-design-talk-at-philly-cocoaheads/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m going to be giving a talk at the local CocoaHeads next week. If you are in Philly area you should stop by.&lt;/p&gt;
&lt;p&gt;Thursday, January 10, 2019&lt;br&gt;
6:30 PM to 9:00 PM&lt;br&gt;
&lt;a href=&#34;https://www.indyhall.org/&#34;&gt;IndyHall&lt;/a&gt;&lt;br&gt;
399 Market Street, Suite 360&lt;br&gt;
&lt;a href=&#34;https://www.meetup.com/PhillyCocoaHeads/events/kvsmnqyzcbnb/&#34;&gt;Meetup RSVP&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;h1 id=&#34;designing-a-modern-swift-network-stack&#34;&gt;Designing a Modern Swift Network Stack&lt;/h1&gt;
&lt;p&gt;When an app is young and has simple networking needs it&amp;rsquo;s not uncommon to use URLSession tasks directly inside of a view controller. However as the app needs grow to include things like authenticated requests, token renewal, testing, cancelation, caching and more &amp;ndash; you&amp;rsquo;ll want to have a more defined networking stack to lean on. On a client project over the summer, the iOS team and I started to document a networking wish list and over the past few months we&amp;rsquo;ve started to execute it, first on some smaller features and then a demos app. Now we are preparing for a new greenfield iOS app where we should be able to hit the ground running with our new ideas.&lt;/p&gt;
&lt;p&gt;In this talk I&amp;rsquo;ll review the network design we&amp;rsquo;ve come up with. I&amp;rsquo;ll demo what we have working and talk about how we want to extend it in the future. Attendee should walk away with new ideas that they can integrate into their own networking stacks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think it will go well and hopefull kickstart some good conversations.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ugly Swift Syntax for Checking Errors</title>
      <link>https://mikezornek.com/posts/2018/11/ugly-swift-syntax-for-checking-errors/</link>
      <pubDate>Wed, 14 Nov 2018 19:19:08 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2018/11/ugly-swift-syntax-for-checking-errors/</guid>
      <description>&lt;p&gt;A common code pattern I see a lot in iOS code is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service.execute(request) { (response, error) &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; error = error {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        handleError(error)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// work with response...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I don’t like that &lt;code&gt;if&lt;/code&gt; statement. I’d much rather use a &lt;code&gt;guard&lt;/code&gt; statement.&lt;/p&gt;
&lt;p&gt;For those who don’t know &lt;code&gt;guard&lt;/code&gt;, the &lt;a href=&#34;https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html&#34;&gt;docs&lt;/a&gt; explain:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A &lt;code&gt;guard&lt;/code&gt; statement, like an &lt;code&gt;if&lt;/code&gt; statement, executes statements depending on the Boolean value of an expression. You use a &lt;code&gt;guard&lt;/code&gt; statement to require that a condition must be true in order for the code after the guard statement to be executed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I like &lt;code&gt;guard&lt;/code&gt; over &lt;code&gt;if&lt;/code&gt; cause it’s more expressive about my intentions that the code after it &lt;strong&gt;should only run&lt;/strong&gt; if there was no error found. Unfortunately, because of the boolean nature of the &lt;code&gt;guard&lt;/code&gt; clause, to do this requires using Implicitly Unwrapped Optionals.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service.execute(request) { (response, error) &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;guard&lt;/span&gt; error == &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        handleError(error!)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// work with response...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I really try to avoid Implicitly Unwrapped Optionals, so much so I use &lt;a href=&#34;https://github.com/realm/SwiftLint&#34;&gt;SwiftLint&lt;/a&gt; to throw warnings for their use. Adding lint exceptions for this regular occurrence, for me, is not an option.&lt;/p&gt;
&lt;p&gt;If you have more control over the &lt;code&gt;service&lt;/code&gt; implementation you might choose to use a &lt;code&gt;Result&lt;/code&gt; type.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt;&amp;lt;T&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; success(T)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; failure(Error)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service.execute(request) { (result) &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;switch&lt;/span&gt; result {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; .failure(&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; error):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        handleError(error)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; .success(&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; response):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        handleResponse(response)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I generally like this but it doesn’t work if you need to support a mixed Swift/Objective-C environment. It also doesn’t account UIKit itself does not use a Result type.&lt;/p&gt;
&lt;p&gt;Code should be beautiful and so I think it’s important to document these things. I’d love to find a better solution and welcome &lt;a href=&#34;mailto:mike@mikezornek.com&#34;&gt;feedback&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Swift Style: Dequeuing and Populating Cells From UITableView</title>
      <link>https://mikezornek.com/posts/2018/10/swift-style-dequeuing-and-populating-cells-from-uitableview/</link>
      <pubDate>Mon, 15 Oct 2018 23:03:40 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2018/10/swift-style-dequeuing-and-populating-cells-from-uitableview/</guid>
      <description>&lt;p&gt;Everyone has an opinion when it comes to Swift code style, and here is mine when it comes to dequeuing and populating cells from &lt;code&gt;UITableView&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;First you should know Apple maintains two methods for dequeuing cells from &lt;code&gt;UITableView&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;func dequeueReusableCell(withIdentifier identifier: String) -&amp;gt; UITableViewCell?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;func dequeueReusableCell(withIdentifier identifier: String, for indexPath: IndexPath) -&amp;gt; UITableViewCell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The second version, with the &lt;code&gt;indexPath&lt;/code&gt; argument addition and non-optional return value, was added in iOS 6 but strangely the original version was never marked as deprecated. The &lt;code&gt;indexPath&lt;/code&gt; version is the one you should use. (I know of no reason why anyone should prefer the original, but I welcome feedback.)&lt;/p&gt;
&lt;p&gt;Now let’s take a look at an implimentation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-swift&#34; data-lang=&#34;swift&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;tableView&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;_&lt;/span&gt; tableView: UITableView, cellForRowAt indexPath: IndexPath) -&amp;gt; UITableViewCell {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; cell = tableView.dequeueReusableCell(withIdentifier: CustomCell.identifier, &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;: indexPath)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; customCell = cell &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt;? CustomCell {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        customCell.item = itemForIndexPath(indexPath)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; cell
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First we dequeue our cell. Notice how we use a class property to provide the cell identifier string value. We do it this way to avoid typos and enable easier refactoring.&lt;/p&gt;
&lt;p&gt;Also note how we avoid any type casting on this dequeue line and instead capture the cell in a simple &lt;code&gt;UITableViewCell&lt;/code&gt; reference. We do this because there is a chance that our tableview might not be properly registered with the cell identifier. Under such a scenario we’ll still get a cell instance but it will not be a &lt;code&gt;CustomCell&lt;/code&gt; instance. I’d much rather return a boring &lt;code&gt;UITableViewCell&lt;/code&gt; than crash with some explicit type casting using &lt;code&gt;as!&lt;/code&gt; here.&lt;/p&gt;
&lt;p&gt;Next we do our type casting using the more forgiving &lt;code&gt;as?&lt;/code&gt;, making a new casted reference if a match happens.&lt;/p&gt;
&lt;p&gt;To populate our cell there are two basic paterns. One would have a very generic cell expose its interface outlets and so you could configure the cell as you see fit depending on your model. The second approach would be to keep the cell’s outlets private and instead have the cell accept a model the cell is suppose to represent.&lt;/p&gt;
&lt;p&gt;I generally lean towards the model approach. I also like to make a method called &lt;code&gt;itemForIndexPath&lt;/code&gt; which helps if I ever refactor the view and introduce sections. If you are worried about coupling consider building a model just for the cell’s needs; a &lt;code&gt;CellViewModel&lt;/code&gt; or something similar.&lt;/p&gt;
&lt;p&gt;And finally, we return our cell reference. 👍&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I&#39;m Teaching a Half Day iOS Refactoring Workshop in July</title>
      <link>https://mikezornek.com/posts/2017/6/im-teaching-a-half-day-ios-refactoring-workshop-in-july/</link>
      <pubDate>Mon, 12 Jun 2017 15:38:30 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2017/6/im-teaching-a-half-day-ios-refactoring-workshop-in-july/</guid>
      <description>&lt;p&gt;When I re-entered the self-employed world last March and launched &lt;a href=&#34;http://zornlabs.com/&#34;&gt;Zorn Labs LLC&lt;/a&gt; one of my main goals was to find a way to continue my education work. The first output of this effort has been workshops, specifically one on Refactoring iOS.&lt;/p&gt;
&lt;p&gt;I’ve developed and taught the workshop for a local development studio &lt;a href=&#34;https://tonicdesign.com/&#34;&gt;Tonic Design&lt;/a&gt; and am now going to run it publicly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://zornlabs.ticketleap.com/ios-refactoring-workshop/details&#34;&gt;iOS Refactoring Workshop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Throwing away bad code and writing something new from scratch is both risky and expensive. You need to avoid this temptation and instead learn to master small improvements over time.&lt;/p&gt;
&lt;p&gt;Refactoring is the art of improving code without changing user behavior. Adding dedicated refactoring time to your workflow and sprints can pay for itself many times over in both added source code flexibility and application stability.&lt;/p&gt;
&lt;p&gt;In this workshop we will review refactoring concepts from a high level and then explore example cases found in many iOS projects. As a group we’ll refactor and discuss the benefits of our changes. We’ll then work on our own (or in pairs) to execute what we’ve learned and then demonstrate the results for the class.&lt;/p&gt;
&lt;p&gt;This workshop is targeted at those iOS developers who are getting over the hump of learning iOS and now want to know how to write higher quality iOS code. This workshop is capped at 12 people to make sure there is plenty of time for questions and individual attention.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tickets for the half day workshop cost $189.00 even (we take care of all the ticketing fees). For more information on the agenda, see &lt;a href=&#34;https://zornlabs.ticketleap.com/ios-refactoring-workshop/details&#34;&gt;the event page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;TICKETS NO LONGER FOR SALE&lt;/p&gt;
&lt;p&gt;Local performances of this workshop (and others in development) are available for corporate purchase. &lt;a href=&#34;mailto:zorn@zornlabs.com&#34;&gt;Contact us&lt;/a&gt; for more information.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Video: UIKit is Dead, Long Live UIKit!</title>
      <link>https://mikezornek.com/posts/2017/5/video-uikit-is-dead-long-live-uikit/</link>
      <pubDate>Mon, 08 May 2017 17:52:22 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2017/5/video-uikit-is-dead-long-live-uikit/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://phillycocoa.org&#34;&gt;Philly CocoaHeads&lt;/a&gt; held a joint meetup with our Android friends for Philly Tech Week. At said meetup there were a bunch of lightning talks, and I did one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;UIKit is Dead, Long Live UIKit!&lt;/p&gt;
&lt;p&gt;With the introduction of Swift and the rise of functional programming ideals in the community, UIKit and its MVC heritage has become a bottleneck for new ideas. This talk speculates how Apple might overcome this in the years to come. Attendee should walk away with a curiosity about the other UI patterns being developed and a resource list to learn more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;iframe src=&#34;https://player.vimeo.com/video/216539655&#34; width=&#34;640&#34; height=&#34;360&#34; frameborder=&#34;0&#34; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&#34;https://vimeo.com/216539655&#34;&gt;UIKit is Dead, Long Live UIKit!&lt;/a&gt; from &lt;a href=&#34;https://vimeo.com/phillycocoa&#34;&gt;Philly CocoaHeads&lt;/a&gt; on &lt;a href=&#34;https://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;related-reading&#34;&gt;Related Reading:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/ReSwift/ReSwift&#34;&gt;https://github.com/ReSwift/ReSwift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://eng.uber.com/new-rider-app/&#34;&gt;https://eng.uber.com/new-rider-app/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52&#34;&gt;https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://www.engbloglocationlabs.com/engineering-blog/2017/4/11/our-experience-architecting-ios-apps-with-viper&#34;&gt;http://www.engbloglocationlabs.com/engineering-blog/2017/4/11/our-experience-architecting-ios-apps-with-viper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I actually had a few vocal flubs in the recording (was a little stressed about the 10 minute limit) but figured I’d use the live one anyways since it has more humanity than me speaking to myself in my room. I hope you enjoy!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Accessibility</title>
      <link>https://mikezornek.com/posts/2016/11/accessibility/</link>
      <pubDate>Sat, 05 Nov 2016 19:28:54 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2016/11/accessibility/</guid>
      <description>&lt;p&gt;At the Apple event a few weeks ago they began with a short video on accessibility.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/XB4cjbYywqg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;I’ve learned a lot about accessibility on iOS over the last few years. Apple’s products are some of the most accessible in the world and for all the frustrations I have with Apple, this is definitely one of the high points I’m proud of.&lt;/p&gt;
&lt;p&gt;I was also really pleased to see our own &lt;a href=&#34;https://www.meetup.com/PhillyCocoaHeads/&#34;&gt;Philly CocoaHeads&lt;/a&gt; give accessibility some attention at a recent Side Project Saturday event. A group of people worked on improving the accessibility of &lt;a href=&#34;https://github.com/wikimedia/wikipedia-ios&#34;&gt;the Wikipedia iOS app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/sps-accessibility.jpeg&#34; alt=&#34;Group of Programmers using Voice Over on iPhone&#34; title=&#34;Group of Programmers using Voice Over on iPhone&#34;&gt;&lt;/p&gt;
&lt;p&gt;Anyways, I think the time is right for development agencies and indy consultants to put accessibility front and center. For them to say loud and proud, any app you hire us to build will have some basic level of accessibility.&lt;/p&gt;
&lt;p&gt;Some people whom I bounced this idea off of thought it would be bad for sales. Maybe. But these are the probably the same clients who question code review because they think it is a similar waste of money. At the end of the day we all have have some level of standards onto which we execute our craft. People hire us because they can’t build software. They need us to point them in the right direction.&lt;/p&gt;
&lt;p&gt;Somewhere out there, a construction agency is in a discussion whether or not to add a wheelchair ramp to the current project. Some people will add it because it’s required by law, others will add it because it’s the right thing to do.&lt;/p&gt;
&lt;p&gt;The software industry moves incredibly fast, maybe even too fast. We don’t have regulations and inspectors like other industries. We have to regulate ourselves. The tools to improve access for our creations are ready. They work really well. They sit there, waiting for us to use them.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I don’t want to come off like I’m some know it all when it comes to accessibility. If you need real help with your app, contact &lt;a href=&#34;http://austinseraphin.com/&#34;&gt;my friend Austin&lt;/a&gt; who does consulting on the subject.&lt;/p&gt;
&lt;p&gt;I do have some experience enhancing a few personal iOS apps and hope to make it a larger priority with my upcoming &lt;a href=&#34;http://restedexperience.com/&#34;&gt;side project&lt;/a&gt;. Like a lot of things, I think the goal here is for continual learning and small, iterative improvements.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Documentation for NSViewController init(nibName:bundle:) is incorrect</title>
      <link>https://mikezornek.com/posts/2016/10/documentation-for-nsviewcontroller-initnibnamebundle-is-incorrect/</link>
      <pubDate>Mon, 17 Oct 2016 17:48:45 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2016/10/documentation-for-nsviewcontroller-initnibnamebundle-is-incorrect/</guid>
      <description>&lt;p&gt;Radar: #28802828&lt;/p&gt;
&lt;iframe src=&#34;https://player.vimeo.com/video/187585476&#34; width=&#34;640&#34; height=&#34;360&#34; frameborder=&#34;0&#34; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href=&#34;https://vimeo.com/187585476&#34;&gt;Documentation for NSViewController init(nibName:bundle:) is incorrect&lt;/a&gt; from &lt;a href=&#34;https://vimeo.com/zorn711&#34;&gt;Mike Zornek&lt;/a&gt; on &lt;a href=&#34;https://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I say the wrong thing a few times in this spontaneous recording but hopefully there is enough here to reveal the problem. Not a major problem by any means but the Mac frameworks need all the love they can get so let’s be sure to report the changes we want to see.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Isolating Mac Application Menu Behaviors</title>
      <link>https://mikezornek.com/posts/2016/9/isolating-mac-application-menu-behaviors/</link>
      <pubDate>Mon, 12 Sep 2016 17:34:58 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2016/9/isolating-mac-application-menu-behaviors/</guid>
      <description>&lt;h2 id=&#34;a-place-for-everything-and-everything-in-it8217s-place&#34;&gt;A Place for Everything, and Everything in It’s Place&lt;/h2&gt;
&lt;p&gt;My side project is a Mac app and last week I was working on a small story about sending feedback.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Send Feedback under Help Menu&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As a user,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I want to be able to Submit Feedback via the Help menu,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;So that I let the developer know what I’d like changed.&lt;/p&gt;
&lt;p&gt;Acceptance Criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Under the Help menu there should be option to submit feedback.&lt;/li&gt;
&lt;li&gt;Upon selecting this menu item a new email will be open.&lt;/li&gt;
&lt;li&gt;to: &lt;code&gt;mzornek+storyteller@gmail.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;subject: &lt;code&gt;[Storyteller Feedback] [1.0(101)]&lt;/code&gt; — that is the version number and build number&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was easy enough to get working but I wasn’t in love with my first implementation. If you read up on the &lt;a href=&#34;https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MenuList/MenuList.html#//apple_ref/doc/uid/10000032-SW1&#34;&gt;Menu documentation&lt;/a&gt; for macOS you’ll find out application menus will follow the &lt;a href=&#34;https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html#//apple_ref/doc/uid/10000060i-CH3-SW2&#34;&gt;Responder Chain&lt;/a&gt; . A responder chain of a document-based application looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/doc_based_responder_chain.png&#34; alt=&#34;responder chain of a document-based application&#34; title=&#34;responder chain of a document-based application&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now while this is a document-based application this behavior is an application-level behavior. The best spot to put it is in the &lt;code&gt;AppDelegate&lt;/code&gt; but I don’t like polluting that class.&lt;/p&gt;
&lt;p&gt;My new solutions helps improve the situation in lieu of the framework’s design constraints. I still have the &lt;code&gt;IBAction&lt;/code&gt; inside the &lt;code&gt;AppDelegate&lt;/code&gt; but it now forwards the behavior to another object that is more isolated, with a single responsibility and is easier to test.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// AppDelegate+SubmitFeedback.swift
import Cocoa

extension AppDelegate {
    @IBAction private func submitFeedback(sender: AnyObject?) {
        submitFeedbackService.submitFeedback()
    }
}


// SubmitFeedbackService.swift
import Cocoa

protocol URLOpener {
    func openURL(url: NSURL) -&amp;gt; Bool
}

extension NSWorkspace: URLOpener { }

struct SubmitFeedbackService {

    private var to: String {
        return &amp;quot;mzornek+storyteller@gmail.com&amp;quot;.urlEscape()
    }

    private var subject: String {
        return &amp;quot;[Feedback: Storyteller \(versionString)] &amp;quot;.urlEscape()
    }

    private var versionString: String {
        let appVersion = NSBundle.mainBundle().appVersion
        let bundleVersion = NSBundle.mainBundle().appBundleVersion
        return &amp;quot;\(appVersion) (\(bundleVersion))&amp;quot;
    }

    private let urlOpener: URLOpener

    init(workspace: URLOpener = NSWorkspace.sharedWorkspace()) {
        urlOpener = workspace
    }

    func submitFeedback() {
        let urlTemplate = &amp;quot;mailto:\(to)?subject=\(subject)&amp;quot;
        guard let emailURL = NSURL(string: urlTemplate) else {
            assertionFailure(&amp;quot;Email should parse fine.&amp;quot;)
            return
        }
        urlOpener.openURL(emailURL)
    }
}

private extension String {
    func urlEscape() -&amp;gt; String {
        guard let result = self.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) else {
            assertionFailure(&amp;quot;Could not escape string for URL&amp;quot;)
            return self
        }
        return result
    }
}

// SubmitFeedbackServiceTests.swift

import XCTest
@testable import Storyteller

class SubmitFeedbackServiceTests: XCTestCase {

    func testCallingSubmitFeedbackOpensAMailtoURL() {
        let mockWorkspace = NSWorkspaceMock()
        let service = SubmitFeedbackService(workspace: mockWorkspace)
        service.submitFeedback()
        XCTAssertNotNil(mockWorkspace.lastOpenedURL)
        XCTAssertEqual(mockWorkspace.lastOpenedURL!.scheme, &amp;quot;mailto&amp;quot;)
    }

}

class NSWorkspaceMock: NSObject, URLOpener {
    var lastOpenedURL: NSURL?
    func openURL(url: NSURL) -&amp;gt; Bool {
        lastOpenedURL = url
        return true
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Feels cleaner to me but I welcome feedback. I also suspect &lt;code&gt;SubmitFeedbackService&lt;/code&gt; will evolve in time as there is other communication needs in the future.&lt;/p&gt;
&lt;p&gt;PS: I hope to share more about the implementation of project in the future. I know there is a void of Mac application programming discussions going on out in the web. I will try to help out with my own journalling the best I can. Questions welcome.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Regarding Knight Rider and Delegation</title>
      <link>https://mikezornek.com/posts/2016/8/regarding-knight-rider-and-delegation/</link>
      <pubDate>Tue, 02 Aug 2016 22:14:36 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2016/8/regarding-knight-rider-and-delegation/</guid>
      <description>&lt;p&gt;One of the saddest aspects of being a &lt;a href=&#34;https://www.bignerdranch.com/&#34;&gt;Big Nerd Ranch&lt;/a&gt; instructor in 2016 is that students these days do not appreciate the Michael Knight is to Delegation, as RoboCop is to Subclassing discussion of yesteryear.&lt;/p&gt;
&lt;p&gt;From &lt;a href=&#34;http://amzn.to/2aOLIBx&#34;&gt;Cocoa Programming for OS X: The Big Nerd Ranch Guide&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Delegation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let’s start with a story: Once upon a time, there was a man with no name. Knight Industries decided that if this man were given guns and wheels and booster rockets, he would be the perfect crime-fighting tool. First they thought, “Let’s subclass him and override everything we need to add the guns and wheels and booster rockets.” The problem was that to subclass Michael Knight, they needed to wire his insides to the guns, wheels, and booster rockets – a time-consuming task requiring lots of specialized knowledge. So instead, Knight Industries created a helper object, the Knight Industries 2000, or “KITT,” a well-equipped car designed to assist Michael Knight in a variety of crime- fighting situations.&lt;/p&gt;
&lt;p&gt;While approaching the perimeter of an arms dealer’s compound, Michael Knight would say, “KITT, I need to get to the other side of that wall.” KITT would then blast a big hole in the wall with a small rocket. After destroying the wall, KITT would return control to Michael, who would charge through the rubble and capture the arms dealer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Note how creating a helper object is different from the RoboCop approach. RoboCop was a man subclassed and extended. The RoboCop project involved dozens of surgeons who extended the man into a fighting machine. This is the approach taken by many object-oriented frameworks.&lt;/p&gt;
&lt;p&gt;In the Cocoa framework, many objects are extended in the Knight Industries way – by supplying them with helper objects. In this section, you are going to provide the speech synthesizer with a type of helper object called a delegate.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What do you think the new metaphor should be?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>The World Needs a Better Core Data</title>
      <link>https://mikezornek.com/posts/2016/6/the-world-needs-a-better-core-data/</link>
      <pubDate>Tue, 07 Jun 2016 19:50:24 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2016/6/the-world-needs-a-better-core-data/</guid>
      <description>&lt;p&gt;Lots of WWDC predictions out there this week. Here’s a dream of mine. Sadly one that I’ve given up on, at least from Apple.&lt;/p&gt;
&lt;h2 id=&#34;a-better-core-data&#34;&gt;A Better Core Data.&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Tracking state is 1970s thinking. We should be tracking changes over time and rendering the current state of the object graph.&lt;/li&gt;
&lt;li&gt;Migrations, the number one feature. As you add new entities to a store, you do so through a migration. Change a column name, you do it through a migration. The current Core Data migration story is embarrassingly complex and very fragile. We need to have trust in our migrations.&lt;/li&gt;
&lt;li&gt;A single, focused, persistent store format. Allowing people to choose between XML, Binary, SQLite, InMemory and Custom adds more pain than it solves. Keep things simple. One on-disk format.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Xcode Shortcut: Quick Open in Assistant</title>
      <link>https://mikezornek.com/posts/2016/1/xcode-shortcut-quick-open-in-assistant/</link>
      <pubDate>Wed, 27 Jan 2016 20:57:45 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2016/1/xcode-shortcut-quick-open-in-assistant/</guid>
      <description>&lt;p&gt;This answer / revelation caused a bit of a stir in the &lt;a href=&#34;http://phillycocoa.org/slack&#34;&gt;Philly CocoaHeads Slack&lt;/a&gt; so I figured I’d share it here as well.&lt;/p&gt;
&lt;p&gt;Lots of people know and live by Xcode’s Quick Open Menu. You hit &lt;code&gt;Command-Shift-O&lt;/code&gt; and start typing the name of a file, a class or a method and have some very good options made available to you. Make a selection, hit return and bam, the file is now live in your editor.&lt;/p&gt;
&lt;p&gt;But what about the assistant editor? Historically some of the best uses for the assistance editor was to view a file’s counterpart file, the header for an implementation file and visa-versa. With Swift’s lack of a header files, some people have come to put use the assistance editor of test files.&lt;/p&gt;
&lt;p&gt;Regardless as to what you want in the assistant editor it’s always been a little clunky to pick the file. Well now you can use the Quick Open menu for this too, and it’s oh so simple.&lt;/p&gt;
&lt;p&gt;Hit &lt;code&gt;Command-Shift-O&lt;/code&gt; and make your selection as normal. Instead of hitting &lt;code&gt;Return&lt;/code&gt;, hit &lt;code&gt;Option-Return&lt;/code&gt; — the file will now open in the assistant editor pane, opening it if need be.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/quick-open-in-assistant.gif&#34; alt=&#34;Quick Open in Assistant in Action GIF&#34; title=&#34;Quick Open in Assistant in Action GIF&#34;&gt;&lt;/p&gt;
&lt;p&gt;That’s all there is to it. It’s a small feature but very handy for those trying to stick to their keyboard and avoid the mouse while moving around in Xcode.&lt;/p&gt;
&lt;p&gt;For a handy Xcode 7 Shortcut Reference Card check out the Big Nerd Ranch &lt;a href=&#34;https://github.com/bignerdranch/iOSCourseResources/blob/master/Xcode%207%20Visual%20Reference%20Card.pdf&#34;&gt;iOS Course Resource repo&lt;/a&gt; for a PDF download. You can also get the card in print by ordering our latest edition of &lt;a href=&#34;http://amzn.to/1lTwb2H&#34;&gt;iOS Programming, 5th Edition&lt;/a&gt; — updated for Xcode 7 and Swift 2.&lt;/p&gt;
&lt;p&gt;PS: Props to &lt;a href=&#34;https://twitter.com/lyricsboy&#34;&gt;@lyricsboy&lt;/a&gt; for catching my typos!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Video: Consuming JSON in Swift</title>
      <link>https://mikezornek.com/posts/2016/1/video-consuming-json-in-swift/</link>
      <pubDate>Mon, 18 Jan 2016 17:04:53 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2016/1/video-consuming-json-in-swift/</guid>
      <description>&lt;p&gt;I gave a talk at Philly CocoaHeads last week reviewing various ways to consume JSON using Swift, including a preview a new open source project we have coming out soon™ from &lt;a href=&#34;https://www.bignerdranch.com/&#34;&gt;Big Nerd Ranch&lt;/a&gt; called &lt;a href=&#34;https://github.com/bignerdranch/Freddy&#34;&gt;Freddy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update April 27, 2025: Video Unavailable.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://vimeo.com/152112429&#34;&gt;Consuming JSON in Swift, Mike Zornek&lt;/a&gt; from &lt;a href=&#34;https://vimeo.com/phillycocoa&#34;&gt;Philly CocoaHeads&lt;/a&gt; on &lt;a href=&#34;https://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;JSON is a fundamental internet format and if you are building iOS apps the chance you need to download and consume JSON files is extremely high. Additionally, with the introduction of the statically typed Swift language it’s been a little more difficult to work with JSON properly. This talk will cover what JSON is, how one can work with it naturally in Swift, the limitations of doing so, a review of a few popular third party solutions and the introduction of a new JSON tool about to be open sourced by Big Nerd Ranch.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Slides: &lt;a href=&#34;https://speakerdeck.com/zorn/consuming-json-in-swift&#34;&gt;https://speakerdeck.com/zorn/consuming-json-in-swift&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iOS Mobile Design with Sketch at Big Nerd Ranch</title>
      <link>https://mikezornek.com/posts/2015/11/ios-mobile-design-with-sketch-at-big-nerd-ranch/</link>
      <pubDate>Thu, 19 Nov 2015 03:01:39 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2015/11/ios-mobile-design-with-sketch-at-big-nerd-ranch/</guid>
      <description>&lt;p&gt;I’ve wanted to get better at using Sketch for a while now and it looks like I might get my wish!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/design-ios-sketch.jpg&#34; alt=&#34;iOS Mobile Design with Sketch&#34; title=&#34;iOS Mobile Design with Sketch&#34;&gt;&lt;/p&gt;
&lt;p&gt;At work we’ve revamped our mobile design class and it now includes learning Sketch alongside mobile design fundamentals. The &lt;a href=&#34;https://training.bignerdranch.com/classes/ios-mobile-design-with-sketch&#34;&gt;class summary&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you have basic design experience in UI, UX, web or responsive web design, this class will teach you to bring your designs to iOS in just five days.&lt;/p&gt;
&lt;p&gt;In this intense week of learning about design for iOS devices, you will design an iOS app, from concept to delivery. With a focus on Sketch, you will learn a process that you can use in any future app design projects.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If this sounds interesting to you I highly encourage you to &lt;a href=&#34;https://training.bignerdranch.com/classes/ios-mobile-design-with-sketch&#34;&gt;register&lt;/a&gt; and join us in January. I’m registered and really looking forward to the class.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Sweating the Little Details of UI Copy</title>
      <link>https://mikezornek.com/posts/2015/10/sweating-the-little-details-of-ui-copy/</link>
      <pubDate>Thu, 15 Oct 2015 22:10:43 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2015/10/sweating-the-little-details-of-ui-copy/</guid>
      <description>&lt;p&gt;While user interface design is not a core responsibility at my current job I do believe it is an important skill in my field and I try to improve all the time. A large aspect of user interface design is choosing the right words. For example, a good UI designer when crafting an iOS alert will honor and consider Apple recommendations. Some notes from the &lt;a href=&#34;https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/index.html&#34;&gt;HIG&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Place buttons appropriately. Ideally, the button that’s most natural to tap should meet two criteria: It should perform the action that users are most likely to want and it should be the least likely to cause problems if a user taps it inadvertently. Specifically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When the most likely button performs a nondestructive action, it should be on the right in a two-button alert. The button that cancels this action should be on the left.&lt;/li&gt;
&lt;li&gt;When the most likely button performs a destructive action, it should be on the left in a two-button alert. The button that cancels this action should be on the right.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Give alert buttons short, logical titles. The best button titles consist of one or two words that describe the result of tapping the button. Follow these guidelines as you create titles for alert buttons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;As with all button titles, use title-style capitalization and no ending punctuation.&lt;/li&gt;
&lt;li&gt;As much as possible, use verbs and verb phrases that relate directly to the alert text—for example, “Cancel,” “View All,” “Reply,” or “Ignore.”&lt;/li&gt;
&lt;li&gt;Use “OK” for a simple acceptance option if there is no better alternative. Avoid using “Yes” or “No.”&lt;/li&gt;
&lt;li&gt;Avoid “you,” “your,” “me,” and “my” as much as possible. Button titles that use these words are often ambiguous and can appear patronizing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;My personal pet peeve isn’t mentioned in the HIG but is present in almost all systems that require a user account:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Forget your password?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;I hate that phrase.&lt;/strong&gt; I find it to be patronizing and judgmental. As if I’m suppose to remember every password I ever created for every little web site and service. Who could?&lt;/p&gt;
&lt;p&gt;Additionally, it’s misleading. If I click a link labeled “New Comment” I expect to be provided a form to make a new comment. If click a link to “Forget your password?” do I expect some flashy animated GIF that will erase some data from my brain? What I want is a link to “Reset Password”. The link title “Reset Password” is clear, focused on the target action to be performed and does not have a hint of judgement.&lt;/p&gt;
&lt;p&gt;Sweat the little things. Read and then reread the &lt;a href=&#34;https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/index.html&#34;&gt;interface guidelines&lt;/a&gt;. Be able to explain why for all your interface choices. Have fun.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How To Play WWDC Sessions at 2x Speed</title>
      <link>https://mikezornek.com/posts/2015/10/how-to-play-wwdc-sessions-at-2x-speed/</link>
      <pubDate>Wed, 14 Oct 2015 23:10:37 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2015/10/how-to-play-wwdc-sessions-at-2x-speed/</guid>
      <description>&lt;p&gt;Now that all the new bits of iOS 9 and OS X 10.11 are in the wild you might find yourself wanting to get up to speed on some of the changes. One great resource to help you get started is &lt;a href=&#34;https://developer.apple.com/videos/&#34;&gt;Apple’s WWDC videos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The WWDC video library has a lot going for it: HD and SD video sizes, slide downloads and now &lt;a href=&#34;https://developer.apple.com/news/?id=10052015a&#34;&gt;even full text search&lt;/a&gt;! The only real negative thing is the sheer amount of content out there. It can get overwhelming and time consuming to watch all the stuff you are interested in. Here’s the hint. Like podcasts, WWDC videos are mostly single voices speaking one at a time and if you have the tools to double the playback speed you’ll find them still very comprehensible.&lt;/p&gt;
&lt;p&gt;Now for the tools. For downloading you can of course use the &lt;a href=&#34;https://developer.apple.com/videos/&#34;&gt;Apple website&lt;/a&gt;. I like this &lt;a href=&#34;https://github.com/insidegui/WWDC&#34;&gt;WWDC Mac app&lt;/a&gt; as well. Once you have the video file on your hard drive you’ll unfortunately need to look for something beside the built-in QuickTime player to help. Even with all its enhancements it sadly doesn’t have this tool of QuickTime’s past. The good news is you can still &lt;a href=&#34;https://support.apple.com/kb/DL923?locale=en_US&#34;&gt;download QuickTime 7&lt;/a&gt; and it works great!&lt;/p&gt;
&lt;p&gt;After you open your movie in QuickTime 7 (you’ll find it installed in the &lt;code&gt;Utilities&lt;/code&gt; folder), use the &lt;code&gt;Window&lt;/code&gt; menu and choose &lt;code&gt;Show A/V Controls&lt;/code&gt;. In this panel you’ll see a slider that let’s you adjust the playback speed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/quicktime7-wwdc.png&#34; alt=&#34;QuickTime 7&#34; title=&#34;QuickTime 7&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now you can watch your chosen WWDC videos in half of the time! Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; My thanks to &lt;a href=&#34;https://twitter.com/paulbrown&#34;&gt;Paul Brown&lt;/a&gt; who let me know that the native QuickTime player can playback faster, even if it is a little hidden. To increase playback speed, bring up the controls with your mouse, then option-click on the fast-forward control. This will increment playback speed by 10% each time you click. You can keep clicking this up to 2.0x playback speed but sadly the audio does not work at 2.0x, you’ll have to limit yourself to 1.9x to retain the faster audio. Thanks again for the help Paul!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Quick Launching for Cocoa Unit Tests</title>
      <link>https://mikezornek.com/posts/2015/10/quick-launching-for-cocoa-unit-tests/</link>
      <pubDate>Wed, 14 Oct 2015 01:22:26 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2015/10/quick-launching-for-cocoa-unit-tests/</guid>
      <description>&lt;p&gt;I was doing some proofreading and research today regarding the latest testing features in Xcode 7. In the process I ended up rereading this article from &lt;a href=&#34;https://www.bignerdranch.com/blog/weve-got-you-covered/&#34;&gt;Mark Dalrymple on code coverage&lt;/a&gt;. It’s a great article but it also reminded me of a little tip I wanted to share on the blog.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    // bail out early if we&#39;re running as a test harness.
    if (NSClassFromString(@&amp;quot;XCTestCase&amp;quot;)) return YES;

    // otherwise load the main storyboard.
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@&amp;quot;MainStoryboard&amp;quot; bundle:nil];
    UIViewController *vc = [storyboard instantiateInitialViewController];
    ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Not only can this type of check help speed up your unit test times by a little bit, but, it also makes sure you aren’t loading things like crash log capture tools, performance monitoring injections, or other things that might otherwise interfere with your unit test logic or code coverage numbers. Now if you are doing the new UI testing you’ll probably have to use some other kind of flag to define this path, but regardless the core idea is the same.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Code Patterns Talk, Video Now Available</title>
      <link>https://mikezornek.com/posts/2015/4/code-patterns-talk-video-now-available/</link>
      <pubDate>Thu, 23 Apr 2015 17:09:17 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2015/4/code-patterns-talk-video-now-available/</guid>
      <description>&lt;p&gt;We’ve been trying to a better job of capturing our main talks at &lt;a href=&#34;http://phillycocoa.org/&#34;&gt;Philly CocoaHeads&lt;/a&gt;. You can find and subscribe to our small but growing collection of videos on Vimeo: &lt;a href=&#34;https://vimeo.com/phillycocoa&#34;&gt;https://vimeo.com/phillycocoa&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I did a talk last month reviewing a some iOS code patterns. The runtime is about 27 minutes. &lt;a href=&#34;mailto:mike@mikezornek.com&#34;&gt;Feedback very welcome.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Update April 27, 2025: Video not available.&lt;/p&gt;
&lt;p&gt;Some Code Patterns, Mike Zornek from &lt;a href=&#34;https://vimeo.com/phillycocoa&#34;&gt;Philly CocoaHeads&lt;/a&gt; on &lt;a href=&#34;https://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This talk covers a handful of code patterns that were successful on my recent projects. Some of these patterns include Block Safety, &amp;ldquo;Tell, Don&amp;rsquo;t Ask&amp;rdquo;, Using DataSources for your network-based *Service objects.&lt;/p&gt;
&lt;p&gt;Apologies the audience participation isn&amp;rsquo;t well captured.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Swift and Cocoa: The Odd Couple</title>
      <link>https://mikezornek.com/posts/2015/3/swift-and-cocoa-the-odd-couple/</link>
      <pubDate>Wed, 04 Mar 2015 16:30:06 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2015/3/swift-and-cocoa-the-odd-couple/</guid>
      <description>&lt;p&gt;Swift and Cocoa are like The Odd Couple. Two people, with drastically different personalities who are joined by fate to live with each other.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/swift-cocoa-odd-couple.jpg&#34; alt=&#34;Swift and Cocoa / Odd Couple&#34; title=&#34;Swift and Cocoa / Odd Couple&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=kDrfHj3j398&#34;&gt;The Odd Couple Theme Song&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One prefers things very explicit and will check and double check things are in order before starting a task. The other is happy letting things happen haphazardly, as things flow; the details can be worked out later.&lt;/p&gt;
&lt;p&gt;One would only ever allow a single item type like socks in his drawer. The other is happy to store a mix of things in his.&lt;/p&gt;
&lt;p&gt;One is very cautious with things handed to it, slowly unwrapping them. The other is extremely trusting and uses stuff passed to it without question, result be dammed.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Girl Develop It: Introduction to iOS Development</title>
      <link>https://mikezornek.com/posts/2014/12/girl-develop-it-introduction-to-ios-development/</link>
      <pubDate>Wed, 31 Dec 2014 18:05:32 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2014/12/girl-develop-it-introduction-to-ios-development/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;http://www.meetup.com/Girl-Develop-It-Philadelphia/events/205223062/&#34;&gt;Introduction to iOS Development&lt;/a&gt; class I’m teaching for Girl Develop It is open and tickets are for sale.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This class will provide attendees an introduction into iOS development through a mix of lecture-style presentations and lots of hands on coding exercises that in total will demonstrate what it is like to be an iOS developer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The 2-day class costs $100 and will be held on Saturday Feb 7th and Sunday Feb 8th.&lt;/p&gt;
&lt;p&gt;If you know of a woman in the Philadelphia area who is interested in iOS please let them know. Thanks.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>An “App Architecture” Kata</title>
      <link>https://mikezornek.com/posts/2014/11/an-app-architecture-kata/</link>
      <pubDate>Mon, 24 Nov 2014 02:00:29 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2014/11/an-app-architecture-kata/</guid>
      <description>&lt;p&gt;At the last &lt;a href=&#34;http://www.meetup.com/PhillyCocoaHeads/events/212626112/&#34;&gt;Side Project Saturday&lt;/a&gt; CocoaHeads event I ran a special little exercise. Here was how I described it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’d like to run a little event, (maybe after lunch?) for anyone who wants to participate. Should take like 45-60m.&lt;/p&gt;
&lt;p&gt;You will be presented with a mobile app idea. It’ll be fairly basic and we’ll list all of the behaviors we need and some we’d like in the future. You will then pair up with someone and pencil out how this could be architected. Each group will then present their app architecture and answer questions, accept feedback from the rest of the group.&lt;/p&gt;
&lt;p&gt;From Wikipedia: A code kata is an exercise in programming which helps a programmer hone their skills through practice and repetition. The term was probably first coined by Dave Thomas, co-author of the book The Pragmatic Programmer, in a bow to the Japanese concept of kata in the martial arts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;App architecture is one of those things I’m always trying to improve so I thought it would be cool to see how other people would solve similar problems.&lt;/p&gt;
&lt;p&gt;We had six people participate. We started with a brief explanation of the app we were going to sketch out an architecture for. Then, we broke up into pairs of two. After about 40 minutes we came back and showed the group what we came up with.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://mikezornek.com/media/images/kata-app-mockup.png&#34;&gt;&lt;img src=&#34;http://mikezornek.com/media/images/kata-app-mockup-thumb.png&#34; alt=&#34;Kata App Wireframe&#34; title=&#34;Kata App Wireframe&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The one group ended up documenting behaviors per screen. They did a great job of documenting the little things that developers might look over as assumed behavior (which add up fast). It was pointed out that it’s also a great idea to document the things you will not be doing since there tends to be lots of great ideas during brainstorms but when you are planning a sprint of a version target you need to be clear about what’s in and what’s out.&lt;/p&gt;
&lt;p&gt;The other two groups (including my own) were more visual, using tools like &lt;a href=&#34;https://www.omnigroup.com/omnigraffle&#34;&gt;OmniGraffle&lt;/a&gt; to draw representation of models, controllers and services. There was some common separation of responsibilities with slight differences: the one group making an “APIStore” that combined the state and networking and another (mine) that favored separate “Network” and “Session” managers.&lt;/p&gt;
&lt;p&gt;Some of the more high-end abstractions I introduced included a FormController that could take a Form model (that had say a collection of FormFields) which described the form at a model level and then through a FormController might be able to render the form on screen through a TableView for a generic representation or maybe through specific outlets to a custom layout. It could also handle things like input validation. True, this is overkill for our one simple login form but assuming this app might grow to contain edit person forms at some point it might not be too bad of an idea (and plus the whole purpose of this event is to discuss interesting ideas).&lt;/p&gt;
&lt;p&gt;I also took the time to introduce a pattern thats been out for a while but is a recent addition to my personal toolkit, that being ViewModel. You can read more about &lt;a href=&#34;http://www.objc.io/issue-13/mvvm.html&#34;&gt;MVVM on objc.io&lt;/a&gt;. In short it’s a great way to centralize the code you use to transform model objects for user interface purposes and keep that logic out of the model.&lt;/p&gt;
&lt;p&gt;In conclusion, everyone who participated seemed to enjoy the exercise and I would encourage you to replicate it amongst your own peers. It’s still up for debate if “Side Project Saturday” is the best venue for such things as many who come have their own stuff to work.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Designing &amp; Planning Your iOS App Workshop Recap</title>
      <link>https://mikezornek.com/posts/2014/11/designing-planning-your-ios-app-workshop-recap/</link>
      <pubDate>Tue, 11 Nov 2014 18:34:29 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2014/11/designing-planning-your-ios-app-workshop-recap/</guid>
      <description>&lt;p&gt;Workshops are a new effort from the &lt;a href=&#34;http://phillycocoa.org/&#34;&gt;Philly CocoaHeads&lt;/a&gt; group. Basic idea is: one workshop every other month, the workshop is a one day 5-6 hour event, that covers a single topic. Our first one was on Intermediate Objective-C and our second one, which was held last Saturday, covered &lt;a href=&#34;http://www.meetup.com/PhillyCocoaHeads/events/207054302/&#34;&gt;Designing &amp;amp; Planning Your iOS App&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/kotaro-workshop.png&#34; alt=&#34;Kotaro Teaching&#34; title=&#34;Kotaro Teaching&#34;&gt;&lt;/p&gt;
&lt;p&gt;Overall the workshop went well. Kotaro Fujita was our main presenter and did a great job of alternating lecture and hands on exercise. At the end, attendees presented what they had worked on and how their app ideas were evolving. The crowd was great with lots of great feedback too. Some of my notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When brainstorming features consider using index cards or mind mapping software. I like &lt;a href=&#34;http://mindnode.com/&#34;&gt;MindNode Pro&lt;/a&gt; and &lt;a href=&#34;https://trello.com/&#34;&gt;Trello&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Spend LOTS of time wire framing, sketching, etc. Be mindful to separate your design time from your production coding time. It’s easy to fall into trap where you are coding things that will not work and this is very expensive. Way better to validate your designs with prototyping first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Document what problem each screen is suppose to solve. Also document the emotions you expect the user to have. For example, on first launch what is your user asking themselves, how can you help educate them? Are you using verbiage they understand? How fast can you deliver your first WOW moment?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get users involved as soon as possible. Preferably before you start to code. Should have some level of idea validation before starting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once you release a build, make customer support your highest priority. Answer every email/tweet within the hour. Let them call you. Doing this is a huge part of getting people to trust you and then later recommending you and your product.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;related-resources&#34;&gt;Related Resources&lt;/h2&gt;
&lt;p&gt;In the spirit of the talk I wanted to share some other related resources.&lt;/p&gt;
&lt;p&gt;So there are two great online courses going on right now regarding starting a startup people might be interested in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stanford’s Startup Class &lt;a href=&#34;http://startupclass.samaltman.com&#34;&gt;http://startupclass.samaltman.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Philly Startup Leaders’s Startup Bootcamp: &lt;a href=&#34;http://phillystartupleaders.org/&#34;&gt;http://phillystartupleaders.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some of it is a little heavy on the VC-funding but otherwise lots of great things to think about.&lt;/p&gt;
&lt;p&gt;Another video I find really helpful to watch and re-watch whenever thinking about which projects I want to work on: &lt;a href=&#34;http://www.ted.com/talks/simon_sinek_how_great_leaders_inspire_action?language=en&#34;&gt;How great leaders inspire action by Simon Sinek&lt;/a&gt;. His explanation of “Why/How/What” is very inspiring for me.&lt;/p&gt;
&lt;p&gt;For some design fundamentals consider reading &lt;a href=&#34;http://www.amazon.com/gp/product/0321534042/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321534042&amp;amp;linkCode=as2&amp;amp;tag=mikezornekcom-20&amp;amp;linkId=IAO5GQMNDK7INJX2&#34;&gt;Design for non Designers by Robin Williams&lt;/a&gt; and &lt;a href=&#34;http://www.amazon.com/gp/product/0321965515/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321965515&amp;amp;linkCode=as2&amp;amp;tag=mikezornekcom-20&amp;amp;linkId=SUDM3JURHOLPW4A3&#34;&gt;Don’t Make Me Think by Steve Krug&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Finally I’ll mention the the &lt;a href=&#34;http://www.amazon.com/gp/product/B004J4XGN6/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B004J4XGN6&amp;amp;linkCode=as2&amp;amp;tag=mikezornekcom-20&amp;amp;linkId=D5NQ6X7O4DTGHMVO&#34;&gt;Lean Startup Book&lt;/a&gt; which I &lt;a href=&#34;http://mikezornek.com/2013/02/25/book-review-the-lean-startup/&#34;&gt;reviewed back in 2013&lt;/a&gt;. It still is a favorite book of mine with some awesome ideas on working fast and based on validations and learning.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>7 Minute Workout Featured on Apple.com</title>
      <link>https://mikezornek.com/posts/2014/6/7-minute-workout-featured-on-apple-com/</link>
      <pubDate>Tue, 10 Jun 2014 19:24:00 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2014/6/7-minute-workout-featured-on-apple-com/</guid>
      <description>&lt;p&gt;One of the apps I worked on, &lt;a href=&#34;https://7minuteworkout.jnj.com/&#34;&gt;7 Minute Workout&lt;/a&gt;, has been featured by Apple again. This time it’s part of the &lt;a href=&#34;http://www.apple.com/iphone-5s/powerful/&#34;&gt;Strength TV ad&lt;/a&gt; which features a bunch of great fitness apps on iOS.&lt;/p&gt;
&lt;p&gt;In related new the DmgCtrl and Tonic merger is kind of official these days. You can read more about it in &lt;a href=&#34;http://technical.ly/philly/2014/06/10/dmgctrl-tonic-design-merge/&#34;&gt;Technical.ly Philly&lt;/a&gt;. You can also check out the revamped &lt;a href=&#34;http://tonicdesign.com/&#34;&gt;Tonic website&lt;/a&gt; which has a bunch of new case studies of some of our recent projects.&lt;/p&gt;
&lt;p&gt;Congrats to all involved.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Video: Getting Started with iOS Development</title>
      <link>https://mikezornek.com/posts/2014/5/video-getting-started-with-ios-development/</link>
      <pubDate>Mon, 19 May 2014 13:28:47 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2014/5/video-getting-started-with-ios-development/</guid>
      <description>&lt;p&gt;Through my position with the &lt;a href=&#34;http://phillycocoa.org/&#34;&gt;Philadelphia CocoaHeads&lt;/a&gt; chapter I am often approached by people who are interested in learning how to program for iOS. The follow presentation serves as a collection of helpful information and recommendations for such people.&lt;/p&gt;





&lt;video
  controls
  class=&#34;mb-0 w-full&#34;
  title=&#34;Getting Started with iOS Development&#34;
&gt;
  &lt;source src=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/getting_started_with_ios_development.mp4&#34; type=&#34;video/mp4&#34;&gt;
  Your browser does not seem to support the video format. You can
  &lt;a href=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/getting_started_with_ios_development.mp4&#34;&gt;download the MP4 file&lt;/a&gt;
  directly.
&lt;/video&gt;

&lt;div class=&#34;mt-2 flex justify-between&#34;&gt;
  &lt;a href=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/getting_started_with_ios_development.mp4&#34;&gt;Download MP4&lt;/a&gt;
  
&lt;/div&gt;

&lt;p&gt;Getting Started with iOS Development from Mike Zornek on Vimeo.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>iOS Development: Things to Like; Things to Hate</title>
      <link>https://mikezornek.com/posts/2014/1/ios-development-things-to-like-things-to-hate/</link>
      <pubDate>Wed, 15 Jan 2014 01:54:57 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2014/1/ios-development-things-to-like-things-to-hate/</guid>
      <description>&lt;h2 id=&#34;things-i-like-about-ios-development&#34;&gt;Things I like about iOS Development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I like writing code in the Objective-C language.&lt;/li&gt;
&lt;li&gt;I like Apple’s provided frameworks and tools. They are, on the whole, very good.&lt;/li&gt;
&lt;li&gt;I like the iOS community’s enthusiasm for great products. It is very inspiring.&lt;/li&gt;
&lt;li&gt;I like that people will pay you good money to build apps for them in iOS. Though this is has good and bad implications.&lt;/li&gt;
&lt;li&gt;I love attending, and over the last few years running, CocoaHeads in Philadelphia.&lt;/li&gt;
&lt;li&gt;I like that the community on a whole is not very secretive. There is a sense we are in this together and people constantly help each other out sharing tips, code and war stories.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;things-i-hate-about-ios-development&#34;&gt;Things I hate about iOS Development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I hate the exclusivity of the AppStore distribution.&lt;/li&gt;
&lt;li&gt;I hate that I can’t side load apps that people build that Apple doesn’t approve of.&lt;/li&gt;
&lt;li&gt;I hate that I have to sign my apps.&lt;/li&gt;
&lt;li&gt;I hate the learning curve and the bugs of the signing process for all but especially for people new to iOS.&lt;/li&gt;
&lt;li&gt;I hate that Apple has a shitty code validator during app signing that will complain when I have methods on my objects that look like private methods on their objects.&lt;/li&gt;
&lt;li&gt;I hate how shitty AppStore search and discovery is.&lt;/li&gt;
&lt;li&gt;I hate the corporate politics that let apps get featured in the store because of “connections”.&lt;/li&gt;
&lt;li&gt;I hate how people continue to manipulate the AppStore ranking system and I hate how little Apple seems improve the situation when many small developers livelihoods are at stake.&lt;/li&gt;
&lt;li&gt;I hate how the Radar bug system doesn’t have tools in place to involve and update the original bug reporter on progress being made. From a third-party perspective most bug reports might as well go into a black hole.&lt;/li&gt;
&lt;li&gt;I hate how in the pit of my stomach I believe that, on the whole, the iPhone and its brethren have not improved society. I think the majority of mobile software has only helped to empower “generation ‘me&amp;rsquo;”, a generation that is “friends” with everyone, but no one. This deserves a post on to itself someday.&lt;/li&gt;
&lt;li&gt;I hate the iOS / Mobile bubble. The fact that people are spending way too much building apps and are not getting a proper return of value on the investment.&lt;/li&gt;
&lt;li&gt;I hate that building products is way riskier than consulting (bubble related).&lt;/li&gt;
&lt;li&gt;I hate that Apple hasn’t shown more interest in providing a library management system. Thankfully we have CocoaPods but since it’s on the outside there is a fear it might not be able to keep up as the tool chain evolves.&lt;/li&gt;
&lt;li&gt;I hate that back when Apple first started to integrate OCUnit into Xcode it enviably killed like 3 or 4 other very promising testing systems because the thought at the time was “well Apple made their choice and will build on it” when in fact Apple never did. Only recently did we see XCTest and it is, right now from a functional perspective, a method renamed version of OCUnit with no new features.&lt;/li&gt;
&lt;li&gt;I hate how Xcode Bots doesn’t have pre and post scripts.&lt;/li&gt;
&lt;li&gt;I hate (hate is a strong word — let’s say disappointed by) the growing community of “Apple Celebrity”. The once full time developers who can build great things but now choose to spend the majority of their time blogging, podcasting and tweeting all day. They partake in a low impact ping pong match of opinions on weekly events and news that frankly doesn’t mean all that much in the grand scheme of things.&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Enums and Switches</title>
      <link>https://mikezornek.com/posts/2013/12/enums-and-switches/</link>
      <pubDate>Sun, 29 Dec 2013 17:31:47 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2013/12/enums-and-switches/</guid>
      <description>&lt;p&gt;If you are one to use &lt;code&gt;enum&lt;/code&gt; to define modes or types in your models or controllers, consider using &lt;code&gt;switch&lt;/code&gt; statements to help branch the different behaviors. If you do so, the complier will help you when you have forgotten to implement behavior for a &lt;code&gt;enum&lt;/code&gt; value.&lt;/p&gt;
&lt;p&gt;Take for example a view controller that might have different behavior if we are in an editing mode, and even more so the editing is handled differently depending on the target device. For this, let’s create an &lt;code&gt;enum&lt;/code&gt; like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;typedef enum ViewControllerMode : NSUInteger {
    ViewControllerModeDefault = 0,
    ViewControllerModeEditingiPhone,
    ViewControllerModeEditingiPad,
} ViewControllerMode;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now if the &lt;code&gt;tableView:didSelectRowAtIndexPath:&lt;/code&gt; method let’s use a switch statement to branch behavior depending on the &lt;code&gt;behaviorMode&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (self.behaviorMode) {
        case ViewControllerModeDefault:
            [self showRecordAtIndexPath:indexPath];
            break;
        case ViewControllerModeEditingiPhone:
            [self editRecordAtIndexPath:indexPath];
            break;
        case ViewControllerModeEditingiPad:
            [self replaceRecordAtIndexPath:indexPath];
            break;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice we are not using a switch &lt;code&gt;default&lt;/code&gt; behavior here. Now let’s add a new enum type called &lt;code&gt;ViewControllerModeEditingiWatch&lt;/code&gt; and compile. Tada! The complier has a warning for us.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Enumeration value &#39;ViewControllerModeEditingiWatch&#39; not handled in switch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This pattern can be extremely helpful to make sure you are accounting for all needed behaviors. Please consider it next time you are working with &lt;code&gt;enum&lt;/code&gt;. Thanks!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Setup Bots Status as a Screensaver</title>
      <link>https://mikezornek.com/posts/2013/12/setup-bots-status-as-a-screensaver/</link>
      <pubDate>Fri, 13 Dec 2013 03:55:24 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2013/12/setup-bots-status-as-a-screensaver/</guid>
      <description>&lt;p&gt;It’s time to turn off that family photo screensaver and switch to something that’s important, CI status screens!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/bots-big-screen.png&#34; alt=&#34;Bots Big Screen&#34; title=&#34;Bots Big Screen&#34;&gt;&lt;/p&gt;
&lt;p&gt;First up you’ll need this screensaver (or something similar), which can be configured to load a single or multiple websites up as a screensaver.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/liquidx/webviewscreensaver&#34;&gt;https://github.com/liquidx/webviewscreensaver&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sadly the screensaver bundle is not developer signed so if you are bit paranoid consider downloading, inspecting and building the thing from source. Or you could be like me and hit run inside of Security after the initial “can’t run, not signed” dialogue.&lt;/p&gt;
&lt;p&gt;Next you’ll need some URLs. I run both Xcode Bots and Jenkins off my Mac mini named GLaDOS and for those you’ll want URLs like:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://glados.local/xcode/bigscreen&#34;&gt;http://glados.local/xcode/bigscreen&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://glados.local:8080/view/Monitor/&#34;&gt;http://glados.local:8080/view/Monitor/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For Jenkins I’m currently using the &lt;a href=&#34;https://wiki.jenkins-ci.org/display/JENKINS/Build+Monitor+Plugin&#34;&gt;Build Monitor Plugin&lt;/a&gt; which is pretty basic but a nice start.&lt;/p&gt;
&lt;p&gt;Here’s to hoping all your returns from coffee breaks are bathed in green and passing tests.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Xcode Bots and Branches</title>
      <link>https://mikezornek.com/posts/2013/12/xcode-bots-and-branches/</link>
      <pubDate>Fri, 13 Dec 2013 02:58:05 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2013/12/xcode-bots-and-branches/</guid>
      <description>&lt;p&gt;Just a little quick tip tonight. If you create a Bot from within Xcode 5 it will assume that the branch you want this Bot to run on is the branch you are currently on. To change this, use the Xcode Bot Web interface. Select your Bot and look for the settings gear in the upper right and then edit the Bot, defining which branch you want to bot to run on.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/xcode-bot-web-settings.png&#34; alt=&#34;Xcode Bot Setting Gear&#34; title=&#34;Xcode Bot Setting Gear&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/xcode-bot-web-settings-details.png&#34; alt=&#34;Xcode Bot Setting Details&#34; title=&#34;Xcode Bot Setting Details&#34;&gt;&lt;/p&gt;
&lt;p&gt;I’m starting to revive an old side project of mine and it’s feeling good so far. I have Xcode Bots running tests and the static analyzer (all green baby!). I also have Jenkins deploying to HockeyApp when I merge &lt;code&gt;development&lt;/code&gt; into my &lt;code&gt;qa&lt;/code&gt; branch. Hope to share more details soon.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>IBOutletCollection</title>
      <link>https://mikezornek.com/posts/2013/11/iboutletcollection/</link>
      <pubDate>Thu, 28 Nov 2013 01:35:39 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2013/11/iboutletcollection/</guid>
      <description>&lt;p&gt;Did a short show and tell at the last CocoaHeads meeting demoing something I learned at work and hadn’t known about before, that being &lt;code&gt;IBOutletCollections&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For seasoned Cocoa developers we all know that an &lt;code&gt;IBAction&lt;/code&gt; is typically how a button sends a message to the controller that something should happen. On the flip side there is &lt;code&gt;IBOutlet&lt;/code&gt; which is a pointer to a view in the UI that let’s the controller have access, typically to update the view’s contents or attributes.&lt;/p&gt;
&lt;p&gt;Well an &lt;code&gt;IBOutletCollection&lt;/code&gt; lets you have access to a whole collection of views via a single connection. In code declaring an &lt;code&gt;IBOutletCollection&lt;/code&gt; is going to look something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@property (strong, nonatomic) IBOutletCollection(UITextField) NSSet *textFields;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you declare the type of the outlet you can be specific such as &lt;code&gt;UITextField&lt;/code&gt; or use higher level classes like &lt;code&gt;UIView&lt;/code&gt; and connect to many different kinds of views. Technically you can use &lt;code&gt;NSArray&lt;/code&gt; but since the order isn’t something I think is guaranteed best to stick to &lt;code&gt;NSSet&lt;/code&gt;. Finally, while most outlets should be using &lt;code&gt;weak&lt;/code&gt; references, these use strong since the view controller needs to own the array that contains the connections.&lt;/p&gt;
&lt;p&gt;When you want to iterate over the collection just use fast enumeration like you normally would with an &lt;code&gt;NSSet&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- (void)updateUI
{
    for (UITextField *textField in self.textFields) {
        textField.text = self.mainTextField.text;
        if (self.isBlue) {
            textField.textColor = self.view.window.tintColor;
        } else {
            textField.textColor = [UIColor redColor];
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For a simple project demo see my &lt;a href=&#34;https://github.com/zorn/OutletDemo&#34;&gt;OutletDemo&lt;/a&gt; project on GitHub.&lt;/p&gt;
&lt;p&gt;Some real world use cases for &lt;code&gt;IBOutletCollection&lt;/code&gt; might include theming (outlet collections for various styles, then making connections to view that should be styled) as well as form access and validation. &lt;code&gt;IBOutletCollection&lt;/code&gt; was introduced in iOS 4 so theres no reason not to check it out. Enjoy.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Updating Homebrew’s “httpListenAddress” Default for Jenkins</title>
      <link>https://mikezornek.com/posts/2013/11/updating-homebrews-httplistenaddress-default-for-jenkins/</link>
      <pubDate>Mon, 25 Nov 2013 02:49:20 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2013/11/updating-homebrews-httplistenaddress-default-for-jenkins/</guid>
      <description>&lt;p&gt;I’ve setup some Jenkins servers in the past for Ruby on Rails apps but these days we are trying to get things running for iOS deployment and testing at work.&lt;/p&gt;
&lt;p&gt;To experiment with some plugins and such I have my own Mac mini and installed Jenkins via Homebrew. Overall it’s working great though I was a bit stumped as to why I couldn’t load the Jenkins webpages outside of using &lt;code&gt;localhost:8080&lt;/code&gt; on the Mac mini itself. Worked fine last I did a clean install.&lt;/p&gt;
&lt;p&gt;Turns out the Launch Agent settings Homebrew gives you (located at &lt;code&gt;~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist&lt;/code&gt; for me) will launch with the following command line parameter &lt;code&gt;--httpListenAddress=127.0.0.1&lt;/code&gt;. Edit this to &lt;code&gt;0.0.0.0&lt;/code&gt; (the default) to allow all addresses.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I know this isn’t the most enjoyable blog post but wanted to post it as Google Food for others who might run into the issue.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Other related posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://www.sailmaker.co.uk/blog/2013/04/02/advanced-jenkins-for-ios-and-mac/&#34;&gt;Advanced Jenkins for iOS and Mac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.thepete.net/blog/2012/07/22/running-frank-as-part-of-ios-ci/&#34;&gt;Running Frank as Part of iOS CI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Video: Introduction to Objective-C Categories</title>
      <link>https://mikezornek.com/posts/2013/5/video-introduction-to-objective-c-categories/</link>
      <pubDate>Thu, 23 May 2013 18:01:37 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2013/5/video-introduction-to-objective-c-categories/</guid>
      <description>&lt;p&gt;I’m hoping to do some formal screencasting, educational videos for iOS and Rails, in the future so for practice I hacked together this little Introduction to Objective-C Categories to try some stuff out. It’s not the worst thing ever so I thought I’d share it and my notes.&lt;/p&gt;





&lt;video
  controls
  class=&#34;mb-0 w-full&#34;
  title=&#34;Introduction to Objective-C Categories&#34;
&gt;
  &lt;source src=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/objective-c-categories.mp4&#34; type=&#34;video/mp4&#34;&gt;
  Your browser does not seem to support the video format. You can
  &lt;a href=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/objective-c-categories.mp4&#34;&gt;download the MP4 file&lt;/a&gt;
  directly.
&lt;/video&gt;

&lt;div class=&#34;mt-2 flex justify-between&#34;&gt;
  &lt;a href=&#34;https://f002.backblazeb2.com/file/mikezornek-com-media/objective-c-categories.mp4&#34;&gt;Download MP4&lt;/a&gt;
  
&lt;/div&gt;

&lt;p&gt;&lt;a href=&#34;http://vimeo.com/66535170&#34;&gt;Objective-C Categories&lt;/a&gt; from &lt;a href=&#34;http://vimeo.com/zorn711&#34;&gt;Mike Zornek&lt;/a&gt; on &lt;a href=&#34;http://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A short introduction to Objective-C categories for iOS and Mac developers.&lt;/p&gt;
&lt;p&gt;As far as what I was trying to learn through the process of making this…&lt;/p&gt;
&lt;h3 id=&#34;what-is-a-good-resolution-to-shoot-at&#34;&gt;What is a good resolution to shoot at?&lt;/h3&gt;
&lt;p&gt;Ended up trying &lt;code&gt;1920x1080&lt;/code&gt; which in TV speak is &lt;code&gt;1080p&lt;/code&gt;. This I think worked well. There is enough screen real estate to show Xcode with all “widgets” open, plus enough room for a side app like the iPhone Simulator. Speaking of which, 1080p barely squeezes both portrait iPhone retina and portrait iPad non-retina. Finally, should this ever be pipped out to a TV it should be full screen with no scaling.&lt;/p&gt;
&lt;p&gt;What I don’t like is how tiny the file browser and non-source text can be. I envision zooming in on occasion to have those read well when needed.&lt;/p&gt;
&lt;h3 id=&#34;how-is-vimeo-these-days&#34;&gt;How is Vimeo these days?&lt;/h3&gt;
&lt;p&gt;I’ve put up a few videos in the past on Vimeo but for this new project I’m considering using their Pro service so I saw this as an opportunity to play around with their stuff.&lt;/p&gt;
&lt;p&gt;Overall things seem good. They are really good about suggesting codec and bit-rate changes to get the most from their platform. They also provide a nice HTML 5 version of their player.&lt;/p&gt;
&lt;p&gt;Why not YouTube? Long term I could see some of this content becoming pay-for or subscriber/membership-based and YouTube isn’t really good for that.&lt;/p&gt;
&lt;h3 id=&#34;to-record-audio-before-video-or-with-video&#34;&gt;To record audio before video or with video?&lt;/h3&gt;
&lt;p&gt;For the majority of my previous screencast work my typical process included recording the audio on its own and then recording the video, matching everything up in editing. The result is a nice, tight video without any real hesitations or pauses.&lt;/p&gt;
&lt;p&gt;For this video I did things more casual. I had a list of things I wanted to demonstrate and recorded my voice right with along the video. There are pros and cons to this.&lt;/p&gt;
&lt;p&gt;Pros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I do enjoy the personality that comes from this style. To hear the typing and a few ums makes a human connection.&lt;/li&gt;
&lt;li&gt;If done well, it can shorten overall capture time.&lt;/li&gt;
&lt;li&gt;It lends itself to camera shots of the speaker, which again can help create a human connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Doing the video live with the audio is much, much harder to perform. It’s easy to miss things you intended to showoff (I did so in this video.)&lt;/li&gt;
&lt;li&gt;I myself have bad allergies and tend to breath into the mic. If recording the audio on its own it’s easier to isolate this.&lt;/li&gt;
&lt;li&gt;Some people will not like hearing the typing.&lt;/li&gt;
&lt;li&gt;If the screencast is based off a fixed script I’ll be able to post a text version easier, which is extremely valuable (for Google-food as well as people who pref text over videos).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the end I think I’ll be going back to audio only first, then screen recording but welcome your feedback.&lt;/p&gt;
&lt;h3 id=&#34;other-random-observations&#34;&gt;Other random observations:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Probably want to hide the dock for more “Xcode space”.&lt;/li&gt;
&lt;li&gt;Those early “title slides” were done in Keynote. Works great for this kind of stuff, especially animations to explain abstract concepts.&lt;/li&gt;
&lt;li&gt;In the future I won’t be typing everything. Longer code will be uncommented in place or dragged in from snippets.&lt;/li&gt;
&lt;li&gt;Could have done some some zooming to help visualize things like the new file Xcode sheet, schema editor.&lt;/li&gt;
&lt;li&gt;Need to overlay URLs in large type when promoting a website.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not sure how fast we’ll see real production start on these videos as I do have a few things already cooking but I don’t mind too much as it’s good to be busy. 🙂&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Xcode Documentation Downloads</title>
      <link>https://mikezornek.com/posts/2013/2/xcode-documentation-downloads/</link>
      <pubDate>Wed, 20 Feb 2013 19:22:19 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2013/2/xcode-documentation-downloads/</guid>
      <description>&lt;p&gt;Rather that use the Mac App Store and re-download Xcode each time I need to install it on a new Mac, I take advantage of &lt;a href=&#34;http://developer.apple.com/downloads/&#34;&gt;developer downloads directory&lt;/a&gt; and grab the Xcode DMG file so I can put on my USB disk and move around from Mac to Mac and avoid the duplicate downloads.&lt;/p&gt;
&lt;p&gt;Xcode however no longer includes the documentation, so the first thing that happens after you launch is a 1.3 GB download for the docs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://mikezornek.com/media/images/xcode_docs.png&#34; alt=&#34;Xcode Documentation Downloader&#34; title=&#34;Xcode Documentation Downloader&#34;&gt;&lt;/p&gt;
&lt;p&gt;Apple, please consider adding a download with a snapshot of the documentation in place. Maybe even a LAN sync option so it could grab the docs from my desktop (or my co-workers) instead of saturating my internet connection all the time.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Focused Testing in Xcode</title>
      <link>https://mikezornek.com/posts/2012/8/focused-testing-in-xcode/</link>
      <pubDate>Mon, 27 Aug 2012 03:10:55 +0000</pubDate>
      <author>mike@mikezornek.com (Mike Zornek)</author>
      <guid>https://mikezornek.com/posts/2012/8/focused-testing-in-xcode/</guid>
      <description>&lt;p&gt;I’ve set a very informal goal to produce content for this blog on a daily basis. We’re not there yet, but before the night is lost, here is a quick Xcode tip I fell into today.&lt;/p&gt;
&lt;p&gt;So I’m using &lt;a href=&#34;https://github.com/RestKit/RestKit&#34;&gt;RestKit&lt;/a&gt; in a client project. In this project we &lt;code&gt;POST&lt;/code&gt; and &lt;code&gt;PUT&lt;/code&gt; lots of records. RestKit does not currently have an option to, when serializing a record, include those record attributes which are &lt;code&gt;nil&lt;/code&gt; as &lt;code&gt;null&lt;/code&gt;s in the resulting &lt;code&gt;JSON&lt;/code&gt;. While there has been an ongoing &lt;a href=&#34;https://github.com/RestKit/RestKit/issues/669&#34;&gt;ticket&lt;/a&gt; for this feature, my own release date is approaching and so I dug in this weekend to see what I could do.&lt;/p&gt;
&lt;p&gt;As part of adding this code, I wanted to run and make additions to the RestKit test suite, but running the whole suite over and over as you are making very specific changes is a bit of a time waste. Here is my Xcode tip.&lt;/p&gt;
&lt;p&gt;When working in an Xcode project that has lots of tests, you can temporarily setup Xcode to only run the tests you are working on by editing the schema. In the schema editor, look for the test action and from there you can expand the test target.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://mikezornek.com/media/images/edit_xcode_schema_to_focus_your_testing.png&#34;&gt;&lt;img src=&#34;http://mikezornek.com/media/images/edit_xcode_schema_to_focus_your_testing.png&#34; alt=&#34;Edit Xcode Schema to Focus Your Testing&#34; title=&#34;Edit Xcode Schema to Focus Your Testing&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You’ll see checkboxes for each test file and they expand further for each test case. Check and uncheck to focus in on the tests you are working around. Hold down the Option key as you click on the checkboxes to turn them all on/off with a single click.&lt;/p&gt;
&lt;p&gt;This can seriously speed up your editing cycle. Just make sure to switch them all back on (or do this change on a schema that isn’t shared in the repo) and verify that the full test suite passes before you commit your changes.&lt;/p&gt;
&lt;p&gt;As for my feature, I think I have it working, but will let things settle down before I generate a nice pull request for the RestKit development branch.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>