<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mac / iPhone App Development &#187; programming</title>
	<atom:link href="http://benreeves.co.uk/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://benreeves.co.uk</link>
	<description>Home of a Small Time Developer</description>
	<lastBuildDate>Wed, 26 May 2010 14:24:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Adding Reachability Code to your app</title>
		<link>http://benreeves.co.uk/adding-reachability-code-to-your-app/</link>
		<comments>http://benreeves.co.uk/adding-reachability-code-to-your-app/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 19:37:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective c]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://www.benreeves.co.uk/?p=130</guid>
		<description><![CDATA[Ok so iVersion 1.4 was declined due to not loading correctly when their is no network connectivity.
When the device is connected to a cellular network, iVersion does not load its contents.  After the user enters the URL (http://svn.collab.net/repos/svn/trunk/) and taps &#8220;connect,&#8221; an error message is received.
Apparently the error message is not clear enough or something, anyway this [...]]]></description>
			<content:encoded><![CDATA[<p>Ok so iVersion 1.4 was declined due to not loading correctly when their is no network connectivity.</p>
<blockquote><p>When the device is connected to a cellular network, iVersion does not load its contents.  After the user enters the URL (<a href="http://svn.collab.net/repos/svn/trunk/" target="_blank" class="broken_link">http://svn.collab.net/repos/svn/trunk/</a>) and taps &#8220;connect,&#8221; an error message is received.</p></blockquote>
<p>Apparently the error message is not clear enough or something, anyway this is not a rant, this is what apple recommends.</p>
<blockquote><p>Please take a look at the Reachability iPhone program sample which demonstrates the use of the System Configuration Reachability API to detect the absence of WiFi and Wireless Wide Area Network (WWAN) services. Your application can then take appropriate action at the first point where network services are required.</p></blockquote>
<p>The sample code can be found on Apple developer site, however the two file we are interested in are:</p>
<p><strong>Download the Reachability Code:</strong><br />
<a href="http://www.benreeves.co.uk/wp-content/uploads/2010/01/Reachability.h">Reachability.h</a></p>
<p><a href="http://www.benreeves.co.uk/wp-content/uploads/2010/01/Reachability.m">Reachability.m</a></p>
<p><strong>How to use:</strong><br />
Lets say you have a simple UILabel which you want to update with either &#8220;(Offline)&#8221; or &#8220;(Online)&#8221; depending on whether the network is reachable. Your view controller would be defined something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MyStatusView <span style="color: #002200;">:</span> UIViewController
<span style="color: #002200;">&#123;</span>
	UILabel <span style="color: #002200;">*</span> statusLabel;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, assign<span style="color: #002200;">&#41;</span> IBOutlet UILabel <span style="color: #002200;">*</span> statusLabel;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>reachabilityChanged<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNotification</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>note;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>updateStatus;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Then we add the following code to the view controller .m file:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewWillAppear<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>animated
<span style="color: #002200;">&#123;</span>
	self.reachability <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>Reachability reachabilityWithHostName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;google.com&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>reachability startNotifer<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNotificationCenter</span> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>reachabilityChanged<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> name<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;kNetworkReachabilityChangedNotification&quot;</span> object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>self updateStatus<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewWillDisappear<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>animated
<span style="color: #002200;">&#123;</span>
	self.reachability <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
	<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNotificationCenter</span> defaultCenter<span style="color: #002200;">&#93;</span> removeObserver<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>reachabilityChanged<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNotification</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>self updateStatus<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>updateStatus
<span style="color: #002200;">&#123;</span>
	NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Reachability changed&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>reachability currentReachabilityStatus<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> NotReachable<span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		statusLabel.text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;(Offline)&quot;</span>;
	<span style="color: #002200;">&#125;</span>
	<span style="color: #a61390;">else</span>
	<span style="color: #002200;">&#123;</span>
		statusLabel.text <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;(Online)&quot;</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>I think it&#8217;s fairly self explanatory. Basically when the view appears the reachability class is created and started using startNotifier. Then we hook in our reachabilityChanged: method into the notification centre, so it is automatically called when the network status changes. reachabilityChanged: calls updateStatus which simply changes our label depending on the connectivity.</p>
]]></content:encoded>
			<wfw:commentRss>http://benreeves.co.uk/adding-reachability-code-to-your-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UIKit Modal Prompt</title>
		<link>http://benreeves.co.uk/uikit-modal-prompt/</link>
		<comments>http://benreeves.co.uk/uikit-modal-prompt/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 19:20:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[modal prompt]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.benreeves.co.uk/?p=121</guid>
		<description><![CDATA[in order to not lock the ui iVersion runs it&#8217;s svn commands in a seperate threads. The promblem arises when one of thses threads needs to prompt for a value e.g. a username / password. Firstly UIKit does not provide a modal alert view and secondly UIKit should only be called from the mainThread.
First we [...]]]></description>
			<content:encoded><![CDATA[<p>in order to not lock the ui iVersion runs it&#8217;s svn commands in a seperate threads. The promblem arises when one of thses threads needs to prompt for a value e.g. a username / password. Firstly UIKit does not provide a modal alert view and secondly UIKit should only be called from the mainThread.</p>
<p>First we create a new class which has a view which will be loaded from a nib, a thread condition to lock the calling thread and two NSString fields to store the result and the string of the button which was clicked.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> MessagePrompt <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span>
<span style="color: #002200;">&#123;</span>
&nbsp;
UIView <span style="color: #002200;">*</span> view;
<span style="color: #400080;">NSCondition</span> <span style="color: #002200;">*</span> promptCondition;
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span> clickedButton Text;
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span> result;
<span style="color: #002200;">&#123;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Our new prompt method can be called from the thread which needs to be locked, it will subsequently call UIKit on the main thread.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">+</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>newPrompt<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>MessagePrompt<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>prompt
<span style="color: #002200;">&#123;</span>
&nbsp;
     <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSThread</span> currentThread<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSThread</span> mainThread<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
          <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Should not be called by Main thread<span style="color: #2400d9;">\n</span>&quot;</span><span style="color: #002200;">&#41;</span>;
          <span style="color: #a61390;">return</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
     prompt.promptCondition <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSCondition</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #002200;">&#91;</span>prompt performSelectorOnMainThread<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>prompt<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> withObject<span style="color: #002200;">:</span>view waitUntilDone<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>prompt.promptCondition wait<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">return</span> prompt;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>This method is called by +(id)NewPrompt and displays a prompt in our window. It also adds targets to each UIButton to receive user actions.</p>
<p style="text-align: center;"><a href="http://www.benreeves.co.uk/wp-content/uploads/2010/01/screen-shot-2009-10-23-at-15.44.00.png"><img class="size-full wp-image-123  aligncenter" title="Prompt Nib Example" src="http://www.benreeves.co.uk/wp-content/uploads/2010/01/screen-shot-2009-10-23-at-15.44.00.png" alt="" width="380" height="269" /></a></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>prompt<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>inView
<span style="color: #002200;">&#123;</span>
     <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span> nib <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span> loadNibNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;MyPromptView&quot;</span> owner<span style="color: #002200;">:</span>self options<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
     inView <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>nib objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;	
&nbsp;
     <span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span> subviews <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self.view subviews<span style="color: #002200;">&#93;</span>;
     <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>UIView <span style="color: #002200;">*</span> cview <span style="color: #a61390;">in</span> subviews<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
          <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>cview isKindOfClass<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIButton class<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
          <span style="color: #002200;">&#123;</span>
               UIButton <span style="color: #002200;">*</span> button <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>UIButton<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>cview;
                <span style="color: #002200;">&#91;</span>button addTarget<span style="color: #002200;">:</span>self action<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>clicked<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> forControlEvents<span style="color: #002200;">:</span>UIControlEventTouchDown<span style="color: #002200;">&#93;</span>;
          <span style="color: #002200;">&#125;</span>
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #002200;">&#91;</span>inView.superview addSubview<span style="color: #002200;">:</span>view<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>This is called when a user clicks a button, it finds the value field and retreives and stores the value in self.message. The prompt condition is then signalled which causes the calling thread to continue running.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>clicked<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIButton<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>sender
<span style="color: #002200;">&#123;</span>
     self.clickedButton <span style="color: #002200;">=</span> sender.currentTitle;
&nbsp;
     UITextView <span style="color: #002200;">*</span> text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>iVersionAppDelegate findSubViewOfKind<span style="color: #002200;">:</span>self.view class<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UITextView class<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
     <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>text<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
         self.message <span style="color: #002200;">=</span> text.text;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #002200;">&#91;</span>self.view removeFromSuperview<span style="color: #002200;">&#93;</span>;
     self.view <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
&nbsp;
    <span style="color: #002200;">&#91;</span>promptCondition <span style="color: #a61390;">signal</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Usage</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">/* Called when svn requires a log message */</span>
svn_error_t <span style="color: #002200;">*</span>
iversion_svn_cl__get_log_message<span style="color: #002200;">&#40;</span><span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">**</span>log_msg,
<span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">**</span>tmp_file,
<span style="color: #a61390;">const</span> apr_array_header_t <span style="color: #002200;">*</span>commit_items,
<span style="color: #a61390;">void</span> <span style="color: #002200;">*</span>baton,
apr_pool_t <span style="color: #002200;">*</span>pool<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
&nbsp;
CommitLogMessagePrompt <span style="color: #002200;">*</span> prompt <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>CommitLogMessagePrompt newPrompt<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">/* Clicked Continue */</span>
     <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>prompt.clickedButton isEqualToString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Continue&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #002200;">*</span>log_msg <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>prompt.message UTF8String<span style="color: #002200;">&#93;</span>;
         <span style="color: #a61390;">return</span> SVN_NO_ERROR;
    <span style="color: #002200;">&#125;</span>
&nbsp;
     <span style="color: #a61390;">return</span> svn_error_create<span style="color: #002200;">&#40;</span>SVN_ERR_CANCELLED, <span style="color: #a61390;">NULL</span>, _<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Delete Cancelled&quot;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://benreeves.co.uk/uikit-modal-prompt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone File System Monitor</title>
		<link>http://benreeves.co.uk/iphone-file-system-monitor/</link>
		<comments>http://benreeves.co.uk/iphone-file-system-monitor/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 19:04:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[file monitor]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.benreeves.co.uk/?p=111</guid>
		<description><![CDATA[I require simple for system monitoring for a new (undisclosed) iphone project. It doesn&#8217;t appear that there is any equivilant to ionotify for the iphone, so I whipped up this polling file system monitor which meets my basic requirements. If you find this code useful feel free to use / distribute etc.

#include &#34;FileSystemMonitor.h&#34;
&#160;
//Setup the monitor
FileSystemMonitor [...]]]></description>
			<content:encoded><![CDATA[<p>I require simple for system monitoring for a new (undisclosed) iphone project. It doesn&#8217;t appear that there is any equivilant to ionotify for the iphone, so I whipped up this polling file system monitor which meets my basic requirements. If you find this code useful feel free to use / distribute etc.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#include &quot;FileSystemMonitor.h&quot;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">//Setup the monitor</span>
FileSystemMonitor <span style="color: #002200;">*</span> monitor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>FileSystemMonitor alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
monitor.delegate <span style="color: #002200;">=</span> self;
<span style="color: #002200;">&#91;</span>monitor monitorPath<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//...In your delegate class</span>
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>nodeWasCreatedAt<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>path
<span style="color: #002200;">&#123;</span>
     <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Created %s<span style="color: #2400d9;">\n</span>&quot;</span>, <span style="color: #002200;">&#91;</span>path UTF8String<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>nodeWasDeletedAt<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>path
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Deleted %s<span style="color: #2400d9;">\n</span>&quot;</span>, <span style="color: #002200;">&#91;</span>path UTF8String<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>fileSizeDidchange<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>path bytes<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">size_t</span><span style="color: #002200;">&#41;</span>difference
<span style="color: #002200;">&#123;</span>
     <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;file Added %ul bytes<span style="color: #2400d9;">\n</span>&quot;</span>, difference<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p><strong>Notes:</strong></p>
<ul>
<li>Can monitor for Deleted files, Created Files and File Size Changes</li>
<li>On an iPhone 3GS it is able to monitor the entire SVN 1.6 source tree and the iVersion source tree (total 11,050 File/Directories) in an execution time of 12s. Due to the low thread priority and the fact that the majority of execution time is IO it does not cause much/any slow down to the UI. However there is still room for improvement.</li>
</ul>
<p><strong>Download:</strong></p>
<p><strong><a href="http://www.benreeves.co.uk/wp-content/uploads/2010/01/FileSystemMonitor.h">FileSystemMonitor.h</a></strong></p>
<p><strong><a href="http://www.benreeves.co.uk/wp-content/uploads/2010/01/FileSystemMonitor.m">FileSystemMonitor.m</a></strong></p>
<p><strong><a href="http://www.benreeves.co.uk/wp-content/uploads/2010/01/FileMonitorDelegateProtocol.h">FileMonitorDelegateProtocol.h</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://benreeves.co.uk/iphone-file-system-monitor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic Arrays with C</title>
		<link>http://benreeves.co.uk/dynamic-arrays-with-c/</link>
		<comments>http://benreeves.co.uk/dynamic-arrays-with-c/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 17:12:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[dynamic arrays]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=81</guid>
		<description><![CDATA[In the final push to add syntax highlighting to iVersion I have been working on optimising the parser.
In the inner parsing loop I have been using the standard NSMutableArray to keep track of various objects and tokens. Objective C message passing is of course an order of times slower than a C function call, even [...]]]></description>
			<content:encoded><![CDATA[<p>In the final push to add syntax highlighting to iVersion I have been working on optimising the parser.</p>
<p>In the inner parsing loop I have been using the standard NSMutableArray to keep track of various objects and tokens. Objective C message passing is of course an order of times slower than a C function call, even if purely for the fact that they can’t be inlined. A great article that explains more about the objective c runtime an be found on the <a href="http://cocoasamurai.blogspot.com/2010/01/understanding-objective-c-runtime.html" target="_blank">cocoa samurai blog</a></p>
<p>So I decided to drop down to a dynamic array using plain C. However even though I’m sure dynamic arrays have been implement thousands of times I couldn’t seem to find any simple implementations.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//** Usage</span>
<span style="color: #11740a; font-style: italic;">//Create an array with capacity 2</span>
CArray <span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> CArrayInit<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">2</span><span style="color: #002200;">&#41;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//Add two buckets</span>
CArrayAdd<span style="color: #002200;">&#40;</span>array, <span style="color: #bf1d1a;">&quot;test&quot;</span><span style="color: #002200;">&#41;</span>;
CArrayAdd<span style="color: #002200;">&#40;</span>array, <span style="color: #bf1d1a;">&quot;another test&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//Add another and it will resize accordingly</span>
CArrayAdd<span style="color: #002200;">&#40;</span>array, <span style="color: #bf1d1a;">&quot;yet another&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">//Print All</span>
<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> ii <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>; ii <span style="color: #002200;">&amp;</span>lt; array<span style="color: #002200;">-&amp;</span>gt;count; <span style="color: #002200;">++</span>ii<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span> buffer <span style="color: #002200;">=</span> CArrayObjectAtIndex<span style="color: #002200;">&#40;</span>array, ii<span style="color: #002200;">&#41;</span>;
        <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;Index: %d - %s<span style="color: #2400d9;">\n</span>&quot;</span>, ii, buffer<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p><strong>Download:</strong></p>
<p><a href="http://www.benreeves.co.uk/wp-content/uploads/2010/01/CArray.h">CArray.h</a></p>
<p><a href="http://www.benreeves.co.uk/wp-content/uploads/2010/01/CArray.c">CArray.c</a></p>
<p><strong>Notes:</strong><br />
The following test  function usually reports about 5x faster than NSMutableArray which I think is a credit to how efficient the Objective C library and messaging system really is considering all the things your missing out on (exceptions, null pointers etc)</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">void</span> CArrayTestRoutine<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
&nbsp;
    CArray <span style="color: #002200;">*</span> array <span style="color: #002200;">=</span> CArrayInit<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>;
&nbsp;
    NSTimeInterval start <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDate</span> date<span style="color: #002200;">&#93;</span> timeIntervalSince1970<span style="color: #002200;">&#93;</span>;
    <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span> test;
&nbsp;
    <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> ii <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>; ii <span style="color: #002200;">&amp;</span>lt; <span style="color: #2400d9;">10000000</span>; <span style="color: #002200;">++</span>ii<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        CArrayAdd<span style="color: #002200;">&#40;</span>array, <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;test&quot;</span><span style="color: #002200;">&#41;</span>;
        test <span style="color: #002200;">=</span> CArrayObjectAtIndex<span style="color: #002200;">&#40;</span>array, CArrayCount<span style="color: #002200;">&#40;</span>array<span style="color: #002200;">&#41;</span><span style="color: #002200;">-</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
     CArrayRemoveObjectAtIndex<span style="color: #002200;">&#40;</span>array, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>;
&nbsp;
     NSTimeInterval end <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDate</span> date<span style="color: #002200;">&#93;</span> timeIntervalSince1970<span style="color: #002200;">&#93;</span>;
     <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;CArray 100,000,000 Elements took %fs<span style="color: #2400d9;">\n</span>&quot;</span>, end<span style="color: #002200;">-</span>start<span style="color: #002200;">&#41;</span>;
&nbsp;
     <span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span> nsarray <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> alloc<span style="color: #002200;">&#93;</span> initWithCapacity<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
     start <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDate</span> date<span style="color: #002200;">&#93;</span> timeIntervalSince1970<span style="color: #002200;">&#93;</span>;
     <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span> <span style="color: #a61390;">string</span>;
&nbsp;
     <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> ii <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>; ii <span style="color: #002200;">&amp;</span>lt; <span style="color: #2400d9;">10000000</span>; <span style="color: #002200;">++</span>ii<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #002200;">&#91;</span>nsarray addObject<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;test&quot;</span><span style="color: #002200;">&#93;</span>;
        <span style="color: #a61390;">string</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>nsarray objectAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>nsarray count<span style="color: #002200;">&#93;</span><span style="color: #002200;">-</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #002200;">&#91;</span>nsarray removeObjectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
&nbsp;
     end <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDate</span> date<span style="color: #002200;">&#93;</span> timeIntervalSince1970<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>nsarray release<span style="color: #002200;">&#93;</span>;
     <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;NSMutableArray 100,000,000 Elements took %fs<span style="color: #2400d9;">\n</span>&quot;</span>, end<span style="color: #002200;">-</span>start<span style="color: #002200;">&#41;</span>;
&nbsp;
     <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>, <span style="color: #002200;">&#91;</span><span style="color: #a61390;">string</span> UTF8String<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
     <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>, <span style="color: #002200;">&#91;</span>test UTF8String<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
     CArrayDestroy<span style="color: #002200;">&#40;</span>array<span style="color: #002200;">&#41;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://benreeves.co.uk/dynamic-arrays-with-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iVersion</title>
		<link>http://benreeves.co.uk/75/</link>
		<comments>http://benreeves.co.uk/75/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 17:06:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective c]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[svn client]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=75</guid>
		<description><![CDATA[iVersion is a SVN client for the iphone 3G and ipod touch.
iVersion uses the open source subversion 1.6 client library, written in plain C, with an Objective C wrapper for simpler interfacing with the Objective C UI. Using an objective C Wrapper the client can easily be abstracted to work with other version control protocols. In [...]]]></description>
			<content:encoded><![CDATA[<p><strong>iVersion is a SVN client for the iphone 3G and ipod touch.</strong></p>
<p>iVersion uses the open source <a rel="self" href="http://subversion.tigris.org/">subversion 1.6 </a>client library, written in plain C, with an Objective C wrapper for simpler interfacing with the Objective C UI. Using an objective C Wrapper the client can easily be abstracted to work with other version control protocols. In the future <a rel="self" href="http://git-scm.com/">git</a>, <a rel="self" href="http://www.selenic.com/mercurial/wiki/">mercurial</a>and <a rel="self" href="http://bazaar-vcs.org/en/">bazaar</a> support maybe included.</p>
<h2>Features</h2>
<ul>
<li>Multi-threaded non-locking ui</li>
<li>OpenSSL support for https:// and svn+ssh:// connections</li>
<li>svn commands: list, info, cat,</li>
<li>Browse Directories</li>
<li>View Commit Logs</li>
<li>View file Info</li>
<li>Bookmarks, History &amp; Directory Cache through NSUserDefaults</li>
</ul>
<p><em>** Commit Support<br />
Subversion does not allow commiting of a single file without a working copy of the previous directory. A work around for this has been found and commit support should be available in a future version.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://benreeves.co.uk/75/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
