<?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>Notes of a Developer &#187; iPhone</title>
	<atom:link href="http://www.developers-life.com/tag/iphone/feed" rel="self" type="application/rss+xml" />
	<link>http://www.developers-life.com</link>
	<description>Develop on Objective-C, UIKit, C, OpenGL for  iPhone, iPad, Mac OS X</description>
	<lastBuildDate>Fri, 03 Feb 2012 11:49:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>ScrollView with scroll&#8217;s indicators, which are shown all the time.</title>
		<link>http://www.developers-life.com/scrollview-with-scrolls-indicators-which-are-shown-all-the-time.html</link>
		<comments>http://www.developers-life.com/scrollview-with-scrolls-indicators-which-are-shown-all-the-time.html#comments</comments>
		<pubDate>Thu, 22 Dec 2011 09:53:13 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Category]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[scroll]]></category>
		<category><![CDATA[UIImageView]]></category>
		<category><![CDATA[UIKit]]></category>
		<category><![CDATA[UIScrollView]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1334</guid>
		<description><![CDATA[My simple solution by writing category for UIImageView, because scroller is imageview. How to use :) Just setup tag for your scrollview and you will get one with scroll indicators, which are shown all the time. 1234567891011121314151617181920212223242526272829303132#define noDisableVerticalScrollTag 836913 #define noDisableHorizontalScrollTag 836914 @implementation UIImageView &#40;ForScrollView&#41; - &#40;void&#41; setAlpha:&#40;float&#41;alpha &#123; &#160; &#160; &#160; &#160; if &#40;self.superview.tag [...]]]></description>
			<content:encoded><![CDATA[<p>My simple solution by writing category for UIImageView, because scroller is imageview.</p>
<p>How to use :)<br />
Just setup tag for your scrollview and you will get one with scroll indicators, which are shown all the time.</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6e371a;">#define noDisableVerticalScrollTag 836913</span><br />
<span style="color: #6e371a;">#define noDisableHorizontalScrollTag 836914</span><br />
<br />
<span style="color: #a61390;">@implementation</span> UIImageView <span style="color: #002200;">&#40;</span>ForScrollView<span style="color: #002200;">&#41;</span> <br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setAlpha<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span>alpha <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self.superview.tag <span style="color: #002200;">==</span> noDisableVerticalScrollTag<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>alpha <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span> <span style="color: #002200;">&amp;&amp;</span> self.autoresizingMask <span style="color: #002200;">==</span> UIViewAutoresizingFlexibleLeftMargin<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self.frame.size.width &lt; <span style="color: #2400d9;">10</span> <span style="color: #002200;">&amp;&amp;</span> self.frame.size.height &gt; self.frame.size.width<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIScrollView <span style="color: #002200;">*</span>sc <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>UIScrollView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>self.superview;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>sc.frame.size.height &lt; sc.contentSize.height<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">return</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self.superview.tag <span style="color: #002200;">==</span> noDisableHorizontalScrollTag<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>alpha <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span> <span style="color: #002200;">&amp;&amp;</span> self.autoresizingMask <span style="color: #002200;">==</span> UIViewAutoresizingFlexibleTopMargin<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self.frame.size.height &lt; <span style="color: #2400d9;">10</span> <span style="color: #002200;">&amp;&amp;</span> self.frame.size.height &lt; self.frame.size.width<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIScrollView <span style="color: #002200;">*</span>sc <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>UIScrollView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>self.superview;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>sc.frame.size.width &lt; sc.contentSize.width<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">return</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>super setAlpha<span style="color: #002200;">:</span>alpha<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #a61390;">@end</span></div></td></tr></tbody></table></div>
<p>If you want both scroll it&#8217;s easy to change code.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/scrollview-with-scrolls-indicators-which-are-shown-all-the-time.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AudioSession AudioRouteChange</title>
		<link>http://www.developers-life.com/audiosession-audioroutechange.html</link>
		<comments>http://www.developers-life.com/audiosession-audioroutechange.html#comments</comments>
		<pubDate>Sat, 17 Dec 2011 09:56:46 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[AudioSessionAddPropertyListener]]></category>
		<category><![CDATA[AudioToolbox]]></category>
		<category><![CDATA[kAudioSessionProperty_AudioRouteChange]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1327</guid>
		<description><![CDATA[if you will use or used AVPlayer or you want just know about changes, you can check AudioRouteChange. Simple solution: Add framework AudioToolbox and add import to file 1#import &#60;AudioToolbox/AudioToolbox.h&#62; Insert into init method or any other 1AudioSessionAddPropertyListener &#40;kAudioSessionProperty_AudioRouteChange, callbackHeadphone_func, self&#41;; Listener callback 12345678910111213141516171819202122232425void callbackHeadphone_func &#40; void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData [...]]]></description>
			<content:encoded><![CDATA[<p>if you will use or used AVPlayer or you want just know about changes, you can check AudioRouteChange.</p>
<p>Simple solution:</p>
<p>Add framework AudioToolbox and add import to file</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6e371a;">#import &lt;AudioToolbox/AudioToolbox.h&gt;</span></div></td></tr></tbody></table></div>
<p>Insert into init method or any other</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">AudioSessionAddPropertyListener <span style="color: #002200;">&#40;</span>kAudioSessionProperty_AudioRouteChange, callbackHeadphone_func, self<span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Listener callback</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">void</span> callbackHeadphone_func <span style="color: #002200;">&#40;</span> <span style="color: #a61390;">void</span> <span style="color: #002200;">*</span>inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, <span style="color: #a61390;">const</span> <span style="color: #a61390;">void</span> <span style="color: #002200;">*</span>inData <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> inID <span style="color: #002200;">==</span> kAudioSessionProperty_AudioRouteChange <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>mainViewController performSelector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>isHeadsetPluggedIn<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> isHeadsetPluggedIn <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; UInt32 routeSize <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/sizeof.html"><span style="color: #a61390;">sizeof</span></a> <span style="color: #002200;">&#40;</span>CFStringRef<span style="color: #002200;">&#41;</span>; CFStringRef route;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; AudioSessionGetProperty <span style="color: #002200;">&#40;</span>kAudioSessionProperty_AudioRoute, <span style="color: #002200;">&amp;</span>routeSize, <span style="color: #002200;">&amp;</span>route<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">/* Known values of route:<br />
&nbsp; &nbsp; &nbsp;&quot;Headset&quot;<br />
&nbsp; &nbsp; &nbsp;&quot;Headphone&quot;<br />
&nbsp; &nbsp; &nbsp;&quot;Speaker&quot;<br />
&nbsp; &nbsp; &nbsp;&quot;SpeakerAndMicrophone&quot;<br />
&nbsp; &nbsp; &nbsp;&quot;HeadphonesAndMicrophone&quot;<br />
&nbsp; &nbsp; &nbsp;&quot;HeadsetInOut&quot;<br />
&nbsp; &nbsp; &nbsp;&quot;ReceiverAndMicrophone&quot;<br />
&nbsp; &nbsp; &nbsp;&quot;Lineout&quot; */</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span> routeStr <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>route;<br />
&nbsp; &nbsp; DLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&quot;</span>,routeStr<span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/audiosession-audioroutechange.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple EKDemo &#8211; EKEvent</title>
		<link>http://www.developers-life.com/simple-ekdemo-ekevent.html</link>
		<comments>http://www.developers-life.com/simple-ekdemo-ekevent.html#comments</comments>
		<pubDate>Sun, 06 Nov 2011 00:28:57 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[others]]></category>
		<category><![CDATA[EKCalendar]]></category>
		<category><![CDATA[EKEvent]]></category>
		<category><![CDATA[EKEventStore]]></category>
		<category><![CDATA[EKEventViewController]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[UIKit]]></category>
		<category><![CDATA[UITableViewController]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1315</guid>
		<description><![CDATA[Now we have controller for creating events. This controller included from 4.0 iOS SDK. SimpleEKDemo The application uses table views to display EKCalendar object and EKEvent objects retrieved from an EKEventStore object. It implements EKEventViewController for viewing and editing existing EKEvents, and uses EKEventEditViewController for creating new EKEvents.]]></description>
			<content:encoded><![CDATA[<p>Now we have controller for creating events. This controller included from 4.0 iOS SDK.</p>
<p><a href="http://www.developers-life.com/wp-content/uploads/2011/11/iOS-Simulator-Screen-shot-Nov-6-2011-2.24.10-AM.png"><img title="iOS Simulator Screen shot Nov 6, 2011 2.24.10 AM" src="http://www.developers-life.com/wp-content/uploads/2011/11/iOS-Simulator-Screen-shot-Nov-6-2011-2.24.10-AM.png" alt="" width="320" height="480" /></a><a href="http://www.developers-life.com/wp-content/uploads/2011/11/iOS-Simulator-Screen-shot-Nov-6-2011-2.21.37-AM.png"><img class="alignnone size-full wp-image-1316" title="iOS Simulator Screen shot Nov 6, 2011 2.21.37 AM" src="http://www.developers-life.com/wp-content/uploads/2011/11/iOS-Simulator-Screen-shot-Nov-6-2011-2.21.37-AM.png" alt="" width="320" height="480" /></a></p>
<p><a href="http://goo.gl/AqdpR">SimpleEKDemo</a></p>
<blockquote><p>The application uses table views to display EKCalendar object and EKEvent objects retrieved from an EKEventStore object. It implements EKEventViewController for viewing and editing existing EKEvents, and uses EKEventEditViewController for creating new EKEvents.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/simple-ekdemo-ekevent.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>My Custom UITextView with syntax highlighting</title>
		<link>http://www.developers-life.com/my-custom-uitextview.html</link>
		<comments>http://www.developers-life.com/my-custom-uitextview.html#comments</comments>
		<pubDate>Sat, 05 Nov 2011 00:51:21 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[others]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[UIFont]]></category>
		<category><![CDATA[UIKit]]></category>
		<category><![CDATA[UITextView]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1306</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://goo.gl/nqOjM"><img class="alignnone size-full wp-image-1307" title="custom UITextView with Highlighting syntax " src="http://www.developers-life.com/wp-content/uploads/2011/11/photo.png" alt="" width="614" height="819" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/my-custom-uitextview.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Color Picker for iOS</title>
		<link>http://www.developers-life.com/color-picker-for-ios.html</link>
		<comments>http://www.developers-life.com/color-picker-for-ios.html#comments</comments>
		<pubDate>Sat, 29 Oct 2011 12:17:25 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[UIColor]]></category>
		<category><![CDATA[UIImage]]></category>
		<category><![CDATA[Ukraine]]></category>
		<category><![CDATA[work]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1302</guid>
		<description><![CDATA[Example: 1234567891011121314151617181920212223242526272829303132333435363738394041- &#40;void&#41;viewDidLoad &#123; &#160; &#160; &#91;super viewDidLoad&#93;; &#160; &#160; &#160; &#160; // Do any additional setup after loading the view, typically from a nib. &#160; &#160; &#160; &#160; if &#40;self.cPicker == nil&#41; &#123; &#160; &#160; &#160; &#160; &#91;self.view setBackgroundColor:&#91;UIColor grayColor&#93;&#93;; &#160; &#160; &#160; &#160; self.cPicker = &#91;&#91;VBColorPicker alloc&#93; initWithFrame:CGRectMake&#40;0, 0, 202, 202&#41;&#93;; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.developers-life.com/wp-content/uploads/2011/10/Screen-Shot-Color-Picker.png"><img class="alignnone size-full wp-image-1303" title="Screen Shot Color Picker" src="http://www.developers-life.com/wp-content/uploads/2011/10/Screen-Shot-Color-Picker.png" alt="" width="317" height="595" /></a></p>
<p>Example:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Do any additional setup after loading the view, typically from a nib.</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self.cPicker <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self.view setBackgroundColor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIColor grayColor<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.cPicker <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>VBColorPicker alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">202</span>, <span style="color: #2400d9;">202</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker setCenter<span style="color: #002200;">:</span>self.view.center<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>_cPicker<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker setDelegate<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker showPicker<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// set default YES!</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker setHideAfterSelection<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// set color from picker</span><br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> pickedColor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIColor <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>color <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_rect setBackgroundColor<span style="color: #002200;">:</span>color<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker hidePicker<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> touchesBegan<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/"><span style="color: #400080;">NSSet</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>touches withEvent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIEvent <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>event <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span><span style="color: #002200;">&#91;</span>_cPicker isHidden<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker hidePicker<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// show picker by double touch</span><br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> touchesEnded<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/"><span style="color: #400080;">NSSet</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>touches withEvent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIEvent <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>event <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; UITouch <span style="color: #002200;">*</span>touch <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>touches anyObject<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>touch.tapCount <span style="color: #002200;">==</span> <span style="color: #2400d9;">2</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker setCenter<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>touch locationInView<span style="color: #002200;">:</span>self.view<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_cPicker showPicker<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p><a href="https://github.com/sakrist/VBColorPicker" target="_blank"><img src="http://www.developers-life.com/wp-content/uploads/2011/08/github-logo-80px.png" alt="" title="github-logo-80px" width="130" height="80" class="alignnone size-full wp-image-1257" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/color-picker-for-ios.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tweeting &#8211; example of Apple</title>
		<link>http://www.developers-life.com/tweeting-example-of-apple.html</link>
		<comments>http://www.developers-life.com/tweeting-example-of-apple.html#comments</comments>
		<pubDate>Wed, 05 Oct 2011 11:51:43 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Example]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[Sample]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[UIKit]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1289</guid>
		<description><![CDATA[Tweeting]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" title="timeline" src="http://gyazo.com/db662f5eefda0745e7ee77bdaed9c5e0.png" alt="" width="238" height="446" /></p>
<p><img class="alignnone" title="simple twet" src="http://gyazo.com/440631f54c9cfec93eae9d2bd3dd216b.png" alt="" width="247" height="48" /></p>
<p><img class="alignnone" title="easy tweet" src="http://gyazo.com/9ff6e31593588cd1c351fbac9b05c25f.png" alt="" width="246" height="369" /></p>
<p><a href="http://www.developers-life.com/wp-content/uploads/2011/10/Tweeting.zip">Tweeting</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/tweeting-example-of-apple.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some Wallpapers</title>
		<link>http://www.developers-life.com/some-wallpapers.html</link>
		<comments>http://www.developers-life.com/some-wallpapers.html#comments</comments>
		<pubDate>Tue, 12 Jul 2011 20:36:30 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Wallpaper]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1225</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[
<a href='http://www.developers-life.com/some-wallpapers.html/autumn-wheat' title='autumn-wheat'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/autumn-wheat-150x150.jpg" class="attachment-thumbnail" alt="autumn-wheat" title="autumn-wheat" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/green-blossom' title='green-blossom'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/green-blossom-150x150.jpg" class="attachment-thumbnail" alt="green-blossom" title="green-blossom" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/home' title='home'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/home-150x150.png" class="attachment-thumbnail" alt="home" title="home" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/iphone-4-warm-wood-wallpaper' title='iPhone 4 warm wood wallpaper'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/iPhone-4-warm-wood-wallpaper-150x150.jpg" class="attachment-thumbnail" alt="iPhone 4 warm wood wallpaper" title="iPhone 4 warm wood wallpaper" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/iphone_dock_papirus' title='iphone_dock_papirus'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/iphone_dock_papirus-150x150.jpg" class="attachment-thumbnail" alt="iphone_dock_papirus" title="iphone_dock_papirus" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/iphone_dock_workplan' title='iphone_dock_workplan'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/iphone_dock_workplan-150x150.jpg" class="attachment-thumbnail" alt="iphone_dock_workplan" title="iphone_dock_workplan" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/iphone_wallpaper_abstract1' title='iphone_wallpaper_abstract1'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/iphone_wallpaper_abstract1-150x150.jpg" class="attachment-thumbnail" alt="iphone_wallpaper_abstract1" title="iphone_wallpaper_abstract1" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/iphone4-user-wall' title='iphone4-user-wall'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/iphone4-user-wall-150x150.jpg" class="attachment-thumbnail" alt="iphone4-user-wall" title="iphone4-user-wall" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/orbatid' title='orbatid'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/orbatid-150x150.png" class="attachment-thumbnail" alt="orbatid" title="orbatid" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/phone3-user-wall2' title='phone3-user-wall2'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/phone3-user-wall2-150x150.jpg" class="attachment-thumbnail" alt="phone3-user-wall2" title="phone3-user-wall2" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/sixteen' title='sixteen'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/sixteen-150x150.png" class="attachment-thumbnail" alt="sixteen" title="sixteen" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/snowberry' title='snowberry'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/snowberry-150x150.jpg" class="attachment-thumbnail" alt="snowberry" title="snowberry" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/summer-wind' title='summer-wind'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/summer-wind-150x150.jpg" class="attachment-thumbnail" alt="summer-wind" title="summer-wind" /></a>
<a href='http://www.developers-life.com/some-wallpapers.html/sunkissed' title='sunkissed'><img width="150" height="150" src="http://www.developers-life.com/wp-content/uploads/2011/07/sunkissed-150x150.jpg" class="attachment-thumbnail" alt="sunkissed" title="sunkissed" /></a>

]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/some-wallpapers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Основы Grand Central Dispatch</title>
		<link>http://www.developers-life.com/%d0%be%d1%81%d0%bd%d0%be%d0%b2%d1%8b-grand-central-dispatch.html</link>
		<comments>http://www.developers-life.com/%d0%be%d1%81%d0%bd%d0%be%d0%b2%d1%8b-grand-central-dispatch.html#comments</comments>
		<pubDate>Fri, 08 Apr 2011 10:00:41 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[GCD]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1206</guid>
		<description><![CDATA[В предыдущих статьях писал, что хотел перевести одну интересную статью с английского, но вот нашел перевод  хорошей статьи на русский. Думаю автор перевода не будет против если я копию возьму себе :) Что это? Grand Central Dispatch, или, ко­рот­ко, GCD — это низ­ко­уров­не­вое API, ко­то­рая от­кры­ва­ет но­вый спо­соб ра­бо­тать с па­рал­лель­ны­ми (ори­ги­наль­но это concurrent, а не [...]]]></description>
			<content:encoded><![CDATA[<p>В предыдущих статьях писал, что хотел перевести одну интересную статью с английского, но вот нашел перевод  <noindex><a href="http://touchdev.ru/documents/1519">хорошей статьи на русский</a></noindex>. Думаю автор перевода не будет против если я копию возьму себе :)</p>
<h3>Что это?</h3>
<p>Grand Central Dispatch, или, ко­рот­ко, GCD — это низ­ко­уров­не­вое API, ко­то­рая от­кры­ва­ет но­вый спо­соб ра­бо­тать с па­рал­лель­ны­ми (ори­ги­наль­но это concurrent, а не parallel, я не знаю нор­маль­но­го пе­ре­во­да, ес­ли кто ска­жет — на­пи­ши­те в ком­мен­та­ри­ях, прим. пер.) про­грам­ма­ми. На са­мом про­стом уровне по­ни­ма­ния, ме­то­до­ло­гия по­хо­жа на <span style="color: #993366;">NSOperationQueue</span>, ко­то­рая поз­во­ля­ет раз­би­вать про­грам­му на неза­ви­си­мые за­да­чи, ко­то­рые за­пус­кать па­рал­лель­но или по­сле­до­ва­тель­но. GCD ра­бо­та­ет на бо­лее низ­ком уровне, предо­став­ля­ет боль­шую про­из­во­ди­тель­ность и не яв­ля­ет­ся ча­стью Cocoa.</p>
<p>В до­пол­не­ние к сред­ствам па­рал­лель­но­го вы­пол­не­ния ко­да, GCD та­к­же предо­став­ля­ет пол­но­стью ин­те­гри­ро­ван­ную си­сте­му об­ра­бот­ки со­бы­тий. Об­ра­бот­чи­ки мо­гут быть скон­фи­гу­ри­ро­ва­ны та­ким об­ра­зом, что­бы ре­а­ги­ро­вать на со­бы­тия от фай­ло­вых де­скрип­то­ров, си­стем­ных пор­тов и про­цес­сов, тай­ме­ров и сиг­на­лов, и на поль­зо­ва­тель­ские со­бы­тия. Эти об­ра­бот­чи­ки ис­пол­ня­ют­ся па­рал­лель­но при по­мо­щи ин­фра­струк­ту­ры GCD.</p>
<p>API GCD пол­но­стью ос­но­ван на так на­зы­ва­е­мых бло­ках, о ко­то­рых я го­во­рил в преды­ду­щих се­ри­ях от­ве­тов на во­про­сы («Поз­воль­те пред­ста­вить»: бло­ки и «Об­суж­де­ние прак­ти­че­ских ас­пек­тов ис­поль­зо­ва­ния бло­ков в обыч­ном ко­де»). GCD мож­но ис­поль­зо­вать и без бло­ков, при­ме­няя тра­ди­ци­он­ные C-​шные ме­ха­низ­мы ука­за­те­лей на функ­ции и кон­тек­ста, но ис­поль­зо­вать бло­ки го­раз­до про­ще и неве­ро­ят­но удоб­нее с прак­ти­че­ской точ­ки зре­ния.</p>
<p>Для по­лу­че­ния си­стем­ной до­ку­мен­та­ции по GCD, мож­но на­брать <span style="color: #993366;">man dispatch</span> в ко­манд­ной стро­ке, ес­ли у вас Snow Leopard.<span id="more-1206"></span></p>
<h3>Зачем это нужно использовать?</h3>
<p>GCD да­ет мно­же­ство пре­иму­ществ пе­ред тра­ди­ци­он­ным мно­го­по­точ­ным про­грам­ми­ро­ва­ни­ем:</p>
<ul>
<li>Про­сто­та ис­поль­зо­ва­ния. GCD ис­поль­зо­вать го­раз­до про­ще, чем по­то­ки. Так как ос­но­вой яв­ля­ют­ся эле­мен­ты ра­бо­ты, а не по­то­ки вы­чис­ле­ний, мож­но про­сто за­пу­стить на вы­пол­не­ние ра­бо­ту, не за­бо­тясь о стан­дарт­ных за­да­чах, та­ких, как ожи­да­ние за­вер­ше­ния ра­бо­ты, от­сле­жи­ва­ние де­скрип­то­ров фай­лов, ис­пол­не­ние ко­да с ка­кой-​то пе­ри­о­дич­но­стью, вре­мен­ная при­оста­нов­ка ра­бо­ты. API, ос­но­ван­ные на бло­ках поз­во­ля­ют с необы­чай­ной лег­ко­стью пе­ре­да­вать кон­текст меж­ду раз­лич­ны­ми ча­стя­ми ко­да.</li>
<li>Эф­фек­тив­ность. GCD ре­а­ли­зо­ван лег­ко­вес­ным спо­со­бом, что де­ла­ет го­раз­до бо­лее прак­тич­ным и быст­рым ис­поль­зо­ва­ние GCD в тех ме­стах, где вы­де­лен­ные по­то­ки слиш­ком за­трат­ны. С этим тес­но свя­за­на про­сто­та ис­поль­зо­ва­ния: от­ча­сти, то, что поз­во­ля­ет так лег­ко ис­поль­зо­вать GCD, поз­во­ля­ет и не силь­но при его ис­поль­зо­ва­нии за­бо­тить­ся об эф­фек­тив­но­сти.</li>
<li>Про­из­во­ди­тель­ность. GCD ав­то­ма­ти­че­ски мас­шта­би­ру­ет­ся (со­зда­ет и уда­ля­ет по­то­ки) в со­от­вет­ствии с за­груз­кой си­сте­мы, что ве­дет за со­бой мень­шее ко­ли­че­ство пе­ре­клю­че­ний кон­тек­ста и боль­шую вы­чис­ли­тель­ную эф­фек­тив­ность.</li>
</ul>
<h3><!--more--></h3>
<h3>Посылки (Dispatch Objects)</h3>
<p>Не смот­ря на то, что GCD — это чи­стый C, он спро­ек­ти­ро­ван в объ­ект­ном сти­ле. Объ­ек­ты GCD на­зы­ва­ют­ся по­сыл­ка­ми (Dispatch Objects). По­сыл­ки ис­поль­зу­ют под­счет ссы­лок, как и объ­ек­ты Cocoa. Для под­сче­та ссы­лок (кон­тро­ля за па­мя­тью) мож­но ис­поль­зо­вать функ­ции <span style="color: #993366;">dispatch_retain</span> и <span style="color: #993366;">dispatch_release</span>. Сто­ит пом­нить, что, в от­ли­чие от объ­ек­тов Cocoa, по­сыл­ки не участ­ву­ют в сбор­ке му­со­ра, то есть ими нуж­но управ­лять вруч­ную, да­же ес­ли вклю­чен сбор­щик му­со­ра (к iOS это по-​преж­не­му по­ка не от­но­сит­ся, прим. пер).</p>
<p>Оче­ре­ди по­сы­лок и ис­точ­ни­ки по­сы­лок (что это — чуть позд­нее) мо­гут быть при­оста­нов­ле­ны и за­пу­ще­ны сно­ва, мо­гут со­дер­жать про­из­воль­ный ука­за­тель на кон­текст, с ни­ми ас­со­ци­и­ро­ван­ный, и «фи­на­лай­зер», то есть за­вер­ша­ю­щую функ­цию. Для бо­лее по­дроб­ной ин­фор­ма­ции мож­но по­смот­реть на man <span style="color: #993366;">dispatch_object</span>.</p>
<h3>Очереди посылок</h3>
<p>Фун­да­мен­таль­ная кон­цеп­ция в GCD — оче­редь по­сы­лок. Это объ­ект, ко­то­рый по­лу­ча­ет ин­фор­ма­цию о за­да­ни­ях и ко­то­рый вы­пол­ня­ет их в той же по­сле­до­ва­тель­но­сти, в ко­то­рой по­лу­чил. Оче­редь мо­жет быть ли­бо па­рал­лель­ной ли­бо по­сле­до­ва­тель­ной. Па­рал­лель­ная оче­редь мо­жет ис­пол­нять мно­го за­да­ний од­но­вре­мен­но, на­сколь­ко это адек­ват­но те­ку­щей за­груз­ке си­сте­мы, при­мер­но как и <span style="color: #993366;">NSOperationQueue</span>. По­сле­до­ва­тель­ная оче­редь бу­дет вы­пол­нять по од­ной за­да­че еди­но­вре­мен­но.</p>
<p>Все­го в GCD три ти­па оче­ре­дей:</p>
<ul>
<li>Глав­ная оче­редь. По­хож на глав­ный по­ток. На са­мом де­ле, за­да­ния, ко­то­рые от­прав­ле­ны на ис­пол­не­ние в глав­ную оче­редь, ис­пол­ня­ют­ся в глав­ном по­то­ке про­цес­са. Ссыл­ку на глав­ную оче­редь мож­но по­лу­чить, вы­звав функ­цию <span style="color: #993366;">dispatch_get_main_queue(). </span>Так как глав­ная оче­редь за­ви­си­ма от од­но­го глав­но­го по­то­ка, это по­сле­до­ва­тель­ная оче­редь.</li>
<li>Гло­баль­ные оче­ре­ди. Гло­баль­ные оче­ре­ди — это па­рал­лель­ные оче­ре­ди, ко­то­рые сов­мест­но ис­поль­зу­ют­ся всем про­цес­сом. Все­го их три: оче­редь с низ­ким при­о­ри­те­том, оче­редь с обыч­ным при­о­ри­те­том, оче­редь с вы­со­ким при­о­ри­те­том. Ссыл­ки на гло­баль­ные оче­ре­ди мож­но по­лу­чить при по­мо­щи функ­ций <span style="color: #993366;">dispatch_get_global_queue</span>, ука­зы­вая, оче­редь с ка­ким при­о­ри­те­том вам нуж­на.</li>
<li>Поль­зо­ва­тель­ские (custom) оче­ре­ди. На са­мом де­ле у них нет на­зва­ния, по­это­му бу­дем на­зы­вать их «поль­зо­ва­тель­ски­ми». Эти оче­ре­ди со­зда­ют­ся при по­мо­щи функ­ции <span style="color: #993366;">dispatch_queue_create</span>. Это по­сле­до­ва­тель­ные оче­ре­ди, ко­то­рые мо­гут ис­пол­нять од­но за­да­ние в каж­дый мо­мент вре­ме­ни. Бла­го­да­ря это­му они мо­гут быть как ме­ха­низм син­хро­ни­за­ции, при­мер­но как mutex в тра­ди­ци­он­ном мно­го­по­точ­ном про­грам­ми­ро­ва­нии.</li>
</ul>
<h3>Создание очередей</h3>
<p>Ес­ли вы хо­ти­те ис­поль­зо­вать поль­зо­ва­тель­скую оче­редь, ее пред­ва­ри­тель­но нуж­но со­здать. Для это­го про­сто вы­зо­ви­те функ­цию <span style="color: #993366;">dispatch_queue_create</span>. Пер­вый па­ра­метр — мет­ка, ко­то­рая ис­поль­зу­ет­ся ис­клю­чи­тель­но в це­лях от­лад­ки. Apple ре­ко­мен­ду­ет ис­поль­зо­вать «об­рат­ное DNS» име­но­ва­ние для со­зда­ния уни­каль­ных имен, на­при­мер, «com.​yourcompany.​subsystem.​task». Эти име­на бу­дут отоб­ра­жать­ся в про­то­ко­лах оши­бок при сбое и мо­гут быть по­лу­че­ны из от­лад­чи­ка, что очень по­мо­га­ет по­нять, что пошло не так. Вто­рой ар­гу­мент функ­ции не под­дер­жи­ва­ет­ся и в на­сто­я­щий мо­мент ту­да нуж­но пе­ре­да­вать NULL.</p>
<h3>Передача заданий в очередь</h3>
<p>Пе­ре­да­ча за­да­ния в оче­редь очень про­ста. Нуж­но вы­звать функ­цию <span style="color: #993366;">dispatch_async</span> и пе­ре­дать ей оче­редь и блок. Оче­редь вы­пол­нит блок, ко­гда смо­жет. Вот при­мер ис­пол­не­ния дли­тель­ной фо­но­вой ра­бо­ты в гло­баль­ной оче­ре­ди:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_global_queue<span style="color: #002200;">&#40;</span>DISPATCH_QUEUE_PRIORITY_DEFAULT, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>self goDoSomethingLongAndInvolved<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Done doing something long and involved&quot;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p><span style="color: #993366;"> dispatch_async</span> воз­вра­ща­ет управ­ле­ние сра­зу же, а блок бу­дет про­дол­жать вы­пол­не­ние асин­хрон­но в фоне.</p>
<p>Ко­неч­но, вы­зы­вать <span style="color: #993366;">NSLog</span> по­сле окон­ча­ния ра­бо­ты бло­ка не ин­те­рес­но. Обыч­но вам нуж­но об­но­вить что-​то в Cocoa-​ин­тер­фей­се, то есть вы­пол­нить ка­кой-​то код в глав­ном по­то­ке. Это мож­но сде­лать, ис­поль­зуя на­сле­ду­е­мые по­сыл­ки, то есть по­сыл­ку в глав­ную оче­редь внут­ри за­да­чи, вы­пол­ня­е­мой в фо­но­вой оче­ре­ди. При­мер­но вот так:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_global_queue<span style="color: #002200;">&#40;</span>DISPATCH_QUEUE_PRIORITY_DEFAULT, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>self goDoSomethingLongAndInvolved<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_main_queue<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>textField setStringValue<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Done doing something long and involved&quot;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Та­к­же есть функ­ция <span style="color: #993366;">dispatch_sync</span>, ко­то­рая де­ла­ет то же са­мое, но при этом ожи­дая, по­ка блок за­вер­шит ис­пол­не­ние пе­ред тем, как вер­нуть управ­ле­ние. Вме­сте с ти­пом <span style="color: #993366;">__block</span>, это мо­жет быть ис­поль­зо­ва­но для по­лу­че­ния воз­вра­ща­е­мо­го зна­че­ния из вы­пол­нен­но­го бло­ка. На­при­мер, ес­ли у вас есть ка­кой-​то код, ис­пол­ня­ю­щий­ся в фо­но­вом по­то­ке (или, еще луч­ше ска­зать, не глав­ной оче­ре­ди по­сы­лок), ко­то­рый дол­жен по­лу­чить зна­че­ние из GUI-​кон­тро­ла. Это мо­жет быть лег­ко сде­ла­но при по­мо­щи функ­ций <span style="color: #993366;">dispatch_sync</span> и <span style="color: #993366;">dispatch_get_main_queue</span>:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">__block <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>stringValue;<br />
dispatch_sync<span style="color: #002200;">&#40;</span>dispatch_get_main_queue<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #11740a; font-style: italic;">// __block variables aren't automatically retained</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #11740a; font-style: italic;">// so we'd better make sure we have a reference we can keep</span><br />
&nbsp; &nbsp; &nbsp;stringValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>textField stringValue<span style="color: #002200;">&#93;</span> copy<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#91;</span>stringValue autorelease<span style="color: #002200;">&#93;</span>;</div></td></tr></tbody></table></div>
<p>// use stringValue in the background now<br />
Прав­да, воз­мож­но, луч­ше все-​та­ки ис­поль­зо­вать асин­хрон­ный стиль на­пи­са­ния ко­да. То есть вме­сто син­хрон­но­го вы­зо­ва, пе­ре­дать по­сыл­ку в глав­ную оче­редь, ко­то­рая, по­сле за­вер­ше­ния, пе­ре­даст по­сыл­ку об­рат­но в фо­но­вую оче­редь. Код бу­дет при­мер­но вот та­кой:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dispatch_queue_t bgQueue <span style="color: #002200;">=</span> myQueue;<br />
dispatch_async<span style="color: #002200;">&#40;</span>dispatch_get_main_queue<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>stringValue <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>textField stringValue<span style="color: #002200;">&#93;</span> copy<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;dispatch_async<span style="color: #002200;">&#40;</span>bgQueue, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// use stringValue in the background now</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>В за­ви­си­мо­сти от то­го, что вам тре­бу­ет­ся, <span style="color: #993366;">myQueue</span> мо­жет быть ли­бо поль­зо­ва­тель­ской оче­ре­дью или од­ной из гло­баль­ных оче­ре­дей.</p>
<h3>Замена блокировок</h3>
<p>Поль­зо­ва­тель­ские оче­ре­ди мо­гут быть ис­поль­зо­ва­ны как ме­ха­низм син­хро­ни­за­ции вме­сто бло­ки­ро­вок (locks). В тра­ди­ци­он­ном мно­го­по­точ­ном про­грам­ми­ро­ва­нии, ес­ли вам необ­хо­ди­мо бы­ло со­зда­вать спе­ци­аль­ные объ­ек­ты, ко­то­рые пред­на­зна­ча­лись для ис­поль­зо­ва­ния в несколь­ких по­то­ках, со­зда­ва­лись спе­ци­аль­ные бло­ки­ров­ки, при по­мо­щи ко­то­рых мож­но бы­ло за­щи­тить до­ступ к та­ко­му об­ще­му объ­ек­ту. Псев­до­код при­ве­ден ни­же:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>something <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">id</span> localSomething;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>lock lock<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;localSomething <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>something retain<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>lock unlock<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">return</span> localSomething;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;</div></td></tr></tbody></table></div>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setSomething<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>newSomething <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>lock lock<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>newSomething <span style="color: #002200;">!=</span> something<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>something release<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; something <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>newSomething retain<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self updateSomethingCaches<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>lock unlock<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>В GCD пе­ре­мен­ную <span style="color: #993366;">lock</span> мож­но за­ме­не­нить на ло­каль­ную пе­ре­мен­ную ти­па «оче­редь»: <span style="color: #993366;">dispatch_queue_t queue;.</span> Что­бы ис­поль­зо­вать оче­редь как ме­ха­низм син­хро­ни­за­ции, оче­редь долж­на быть поль­зо­ва­тель­ской, а не гло­баль­ной, что­бы мож­но бы­ло ее про­и­ни­ци­а­ли­зи­ро­вать при по­мо­щи <span style="color: #993366;">dispatch_queue_create</span>. По­сле это­го мож­но весь код до­сту­па к об­щим дан­ным внут­ри <span style="color: #993366;">dispatch_sync</span> или <span style="color: #993366;">dispatch_async</span>:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>something <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;__block <span style="color: #a61390;">id</span> localSomething;<br />
&nbsp; &nbsp; &nbsp;dispatch_sync<span style="color: #002200;">&#40;</span>queue, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; localSomething <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>something retain<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;&nbsp; <br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>localSomething autorelease<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setSomething<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>newSomething <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;dispatch_async<span style="color: #002200;">&#40;</span>queue, <span style="color: #002200;">^</span><span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>newSomething <span style="color: #002200;">!=</span> something<span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>something release<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;something <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>newSomething retain<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>self updateSomethingCaches<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>Сто­ит от­ме­тить, что оче­ре­ди по­сы­лок ис­клю­чи­тель­но лег­ко­вес­ны, по­это­му ис­поль­зо­ва­ние их в ка­че­стве ме­ха­низ­ма бло­ки­ров­ки пол­но­стью оправ­да­но.<br />
В этом ме­сте вы, долж­но быть, ду­ма­е­те, что это все хо­ро­шо, но в чем смысл? Мы пе­ре­шли с од­но­го ме­ха­низ­ма на дру­гой, ко­то­рый вы­гля­дит при­мер­но та­к­же. За­чем? До­сто­инств у ме­ха­низ­ма GCD несколь­ко:</p>
<ul>
<li>Па­рал­ле­лизм. По­смот­ри­те, как <span style="color: #993366;">-setSomething</span> ис­поль­зу­ет <span style="color: #993366;">dispatch_async</span> во вто­рой вер­сии ко­да. Это обо­зна­ча­ет, что вы­зов из <span style="color: #993366;">-setSomething</span> тут же вер­нет управ­ле­ние и вся осталь­ная ра­бо­та бу­дет вы­пол­не­на в фоне. Это мо­жет быть су­ще­ствен­ным вы­иг­ры­шем, ес­ли <span style="color: #993366;">updateSomethingCaches</span> — за­трат­ная опе­ра­ция, в то вре­мя, как вы­зы­ва­ю­щая функ­ция то­же долж­на бу­дет вы­пол­нить что-​то объ­ем­ное.</li>
<li>Без­опас­ность. Невоз­мож­но слу­чай­но на­пи­сать код, ко­то­рый нераз­бло­ки­ру­ет объ­ект, пред­ва­ри­тель­но его за­бло­ки­ро­вав. В тра­ди­ци­он­ном под­хо­де до­ста­точ­но лег­ко, на­при­мер, по­ста­вить ка­кой-​ни­будь return внутрь ме­то­да, тем са­мым оста­вив бло­ки­ров­ку в «под­ве­шен­ном» со­сто­я­нии.</li>
<li>Кон­троль. Воз­мож­ность при­оста­но­вить и воз­об­но­вить вы­пол­не­ние за­да­ний в оче­ре­дях от­сут­ству­ет при ис­поль­зо­ва­нии тра­ди­ци­он­ных бло­ки­ро­вок. Та­к­же от­сут­ству­ет воз­мож­ность кон­тро­ли­ро­вать при­о­ри­тет вы­пол­не­ния за­дач «внут­ри» бло­ки­ро­вок и ис­пол­не­ния там же ко­да в дру­гих по­то­ках (на­при­мер, в глав­ном по­то­ке, ес­ли это необ­хо­ди­мо).</li>
<li>Ин­те­гра­ция. Со­бы­тий­ная си­сте­ма GCD ин­те­гри­ру­ет­ся с оче­ре­дя­ми со­бы­тий. Лю­бые со­бы­тия или тай­ме­ры, ко­то­рые нуж­ны объ­ек­ту, мо­гут быть пе­ре­на­прав­ле­ны в оче­редь это­го объ­ек­та, та­ким об­ра­зом за­ста­вив их там вы­пол­нять­ся, то есть, ав­то­ма­ти­че­ски «син­хро­ни­зи­ру­ясь» с объ­ек­том.</li>
</ul>
<h4>Заключение</h4>
<p><span style="font-weight: normal;">Те­перь вам из­вест­ны ос­но­вы GCD, про­це­ду­ра со­зда­ния оче­ре­дей, как от­прав­лять за­да­ния в оче­ре­ди и как их ис­поль­зо­вать для син­хро­ни­за­ции вме­сто мно­го­по­точ­ных бло­ки­ро­вок. В сле­ду­ю­щей ча­сти бу­дут по­ка­за­ны тех­ни­ки ис­поль­зо­ва­ния GCD для уве­ли­че­ния про­из­во­ди­тель­но­сти мно­го­ядер­ных си­стем. А по­том зай­мем­ся еще бо­лее глу­бо­ким ана­ли­зом GCD, вклю­чая си­сте­му со­бы­тий и пла­ни­ро­ва­ние оче­ре­дей.</span></p>
<h4>Ресурсы</h4>
<p><span style="font-weight: normal;">Ори­ги­нал ста­тьи: <noindex><a href="http://www.mikeash.com/pyblog/friday-qa-2009-08-28-intro-to-grand-central-dispatch-part-i-basics-and-dispatch-queues.html" target="_blank">Intro to Grand Central Dispatch, Part I: Basics and Dispatch Queues</a></noindex></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/%d0%be%d1%81%d0%bd%d0%be%d0%b2%d1%8b-grand-central-dispatch.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding SVN revision to Xcode project</title>
		<link>http://www.developers-life.com/adding-svn-revision-to-xcode-project.html</link>
		<comments>http://www.developers-life.com/adding-svn-revision-to-xcode-project.html#comments</comments>
		<pubDate>Wed, 23 Feb 2011 12:43:01 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[RegExp]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1193</guid>
		<description><![CDATA[Просмотр ревизии в самом приложении предотвращает путаницу и всякие проблемы с отслеживанием текущей версии. Чтоб отслеживать версию репозитория нам нужно добавить слдеющий код bash скрипта. 12345678910REVISION=`svnversion -nc &#124; /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` APPVERSION=`/usr/libexec/PlistBuddy -c &#34;Print CFBundleVersion&#34; &#34;${TARGET_BUILD_DIR}&#34;/${INFOPLIST_PATH}` xported=&#34;xported&#34; if &#91; $APPVERSION != $xported &#93;; then &#160; &#160; &#160;/usr/libexec/PlistBuddy -c &#34;Delete :CFBundleDisplayVersion&#34; &#34;${TARGET_BUILD_DIR}&#34;/${INFOPLIST_PATH} &#160; &#160; &#160;/usr/libexec/PlistBuddy -c [...]]]></description>
			<content:encoded><![CDATA[<p>Просмотр ревизии в самом приложении предотвращает путаницу и всякие проблемы с отслеживанием текущей версии.</p>
<p>Чтоб отслеживать версию репозитория нам нужно добавить слдеющий код bash скрипта.</p>
<div class="codecolorer-container bash geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">REVISION</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">svnversion</span> <span style="color: #660033;">-nc</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'s/^[^:]*://;s/[A-Za-z]//'</span><span style="color: #000000; font-weight: bold;">`</span><br />
<span style="color: #007800;">APPVERSION</span>=<span style="color: #000000; font-weight: bold;">`/</span>usr<span style="color: #000000; font-weight: bold;">/</span>libexec<span style="color: #000000; font-weight: bold;">/</span>PlistBuddy <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;Print CFBundleVersion&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${TARGET_BUILD_DIR}</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${INFOPLIST_PATH}</span><span style="color: #000000; font-weight: bold;">`</span><br />
<br />
<span style="color: #007800;">xported</span>=<span style="color: #ff0000;">&quot;xported&quot;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$APPVERSION</span> <span style="color: #000000; font-weight: bold;">!</span>= <span style="color: #007800;">$xported</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>libexec<span style="color: #000000; font-weight: bold;">/</span>PlistBuddy <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;Delete :CFBundleDisplayVersion&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${TARGET_BUILD_DIR}</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${INFOPLIST_PATH}</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>libexec<span style="color: #000000; font-weight: bold;">/</span>PlistBuddy <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;Add :CFBundleDisplayVersion string&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${TARGET_BUILD_DIR}</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${INFOPLIST_PATH}</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>libexec<span style="color: #000000; font-weight: bold;">/</span>PlistBuddy <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;Set :CFBundleDisplayVersion <span style="color: #007800;">$APPVERSION</span>.<span style="color: #007800;">$REVISION</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${TARGET_BUILD_DIR}</span>&quot;</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${INFOPLIST_PATH}</span><br />
<span style="color: #000000; font-weight: bold;">fi</span></div></td></tr></tbody></table></div>
<p>Чтоб добавить скрипт, необходимо выполнить следующие действия:<br />
1. Зажать Ctrl+клик на фаил проекта в дереве проекта<br />
2. Add->New Build Phase -> New Run Script Build Phase<br />
3. Откроется окно в которое нужно вставить скрипт.</p>
<p><span id="more-1193"></span></p>
<p>В самом проекте, пример на сплеш скрине, создаем лейбл и читаем версию программы к примеру как-то так.</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>version <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Version &quot;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span style="color: #400080;">NSBundle</span></a> mainBundle<span style="color: #002200;">&#93;</span> objectForInfoDictionaryKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CFBundleDisplayVersion&quot;</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>version stringByAppendingString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span style="color: #400080;">NSBundle</span></a> mainBundle<span style="color: #002200;">&#93;</span> objectForInfoDictionaryKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CFBundleDisplayVersion&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p><img src="http://gyazo.com/150e15a5c21dbae21bcb6d5026220da2.png" alt="Adding SVN revision to Xcode project" /></p>
<p>Существует и второй вариант, более простой. (На самом деле можно придумать еще много разных способов.) Добавляем следующий bash скрипт в проект и добавляем фаил revision.h.</p>
<div class="codecolorer-container bash geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">REV</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">svnversion</span> -n<span style="color: #000000; font-weight: bold;">`</span><br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;#define kRevisionNumber @<span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #007800;">$REV</span><span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #800000;">${PROJECT_DIR}</span><span style="color: #000000; font-weight: bold;">/</span>revision.h</div></td></tr></tbody></table></div>
<p>Желательно фаил вставить в один какой-то дальний хидер, чтоб при компилировании не пересобирался весь проект. </p>
<p>Для этого варианта можно написать что-то типа этого:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> <span style="color: #002200;">*</span>version <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Version &quot;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span style="color: #400080;">NSBundle</span></a> mainBundle<span style="color: #002200;">&#93;</span> objectForInfoDictionaryKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CFBundleVersion&quot;</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>version stringByAppendingString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSBundle_Class/"><span style="color: #400080;">NSBundle</span></a> mainBundle<span style="color: #002200;">&#93;</span> objectForInfoDictionaryKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CFBundleVersion&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>version stringByAppendingString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;.&quot;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>version stringByAppendingString<span style="color: #002200;">:</span>kRevisionNumber<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&quot;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/adding-svn-revision-to-xcode-project.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Restoring playlists from iPhone/iPad for iTunes</title>
		<link>http://www.developers-life.com/restoring-playlists-from-iphoneipad-for-itunes.html</link>
		<comments>http://www.developers-life.com/restoring-playlists-from-iphoneipad-for-itunes.html#comments</comments>
		<pubDate>Wed, 24 Nov 2010 11:23:51 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1162</guid>
		<description><![CDATA[Возникла проблема после обновления Mac OS X и iTunes. Поломалась база iTunes и плейлисты были утеряны. Но часть плейлистов осталась на iPhone! И их то мы и востановим. Востановив Mac OS X и iTunes, вкинул всю музыку в iTunes снова. Подключил iPhone и сделал export плейлиста. В формате xml: Далее сделал import Готово! Плейлист востановлен! [...]]]></description>
			<content:encoded><![CDATA[<p>Возникла проблема после обновления Mac OS X и iTunes. Поломалась база iTunes и плейлисты были утеряны.</p>
<p>Но часть плейлистов осталась на iPhone! И их то мы и востановим.</p>
<p><span id="more-1162"></span></p>
<p>Востановив Mac OS X и iTunes, вкинул всю музыку в iTunes снова.</p>
<p>Подключил iPhone и сделал export плейлиста.<br />
<a href="http://www.developers-life.com/wp-content/uploads/2010/11/Screen-shot-2010-11-24-at-1.14.59-PM.png"><img class="alignnone size-full wp-image-1163" title="Screen shot 2010-11-24 at 1.14.59 PM" src="http://www.developers-life.com/wp-content/uploads/2010/11/Screen-shot-2010-11-24-at-1.14.59-PM.png" alt="" width="173" height="134" /></a></p>
<p>В формате xml:<br />
<a href="http://www.developers-life.com/wp-content/uploads/2010/11/Screen-shot-2010-11-24-at-1.15.33-PM.png"><img class="alignnone size-thumbnail wp-image-1164" title="Screen shot 2010-11-24 at 1.15.33 PM" src="http://www.developers-life.com/wp-content/uploads/2010/11/Screen-shot-2010-11-24-at-1.15.33-PM-150x150.png" alt="" width="150" height="150" /></a></p>
<p>Далее сделал import<br />
<a href="http://www.developers-life.com/wp-content/uploads/2010/11/Screen-shot-2010-11-24-at-1.18.42-PM.png"><img class="alignnone size-thumbnail wp-image-1165" title="Screen shot 2010-11-24 at 1.18.42 PM" src="http://www.developers-life.com/wp-content/uploads/2010/11/Screen-shot-2010-11-24-at-1.18.42-PM-150x150.png" alt="" width="150" height="150" /></a></p>
<p>Готово! Плейлист востановлен! Мелочь, а приятно, что не нужно опять перебирать музыку.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/restoring-playlists-from-iphoneipad-for-itunes.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

