<?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; Mac OS X</title>
	<atom:link href="http://www.developers-life.com/tag/mac-os-x/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>ANSI escape sequences for coloring</title>
		<link>http://www.developers-life.com/ansi-escape-sequences-for-coloring.html</link>
		<comments>http://www.developers-life.com/ansi-escape-sequences-for-coloring.html#comments</comments>
		<pubDate>Thu, 02 Feb 2012 11:06:07 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[ANSI]]></category>
		<category><![CDATA[GeekTool]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1434</guid>
		<description><![CDATA[More about ANSI escape code I modify my twitter script from previous post and now timeline looks like this:]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.developers-life.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-02-at-12.58.01-PM.png"><img src="http://www.developers-life.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-02-at-12.58.01-PM-234x300.png" alt="" title="Screen Shot 2012-02-02 at 12.58.01 PM" width="234" height="300" class="alignnone size-medium wp-image-1435" /></a></p>
<p>More about <a href="http://en.wikipedia.org/wiki/ANSI_escape_code" target="_blank">ANSI escape code</a></p>
<p>I modify my twitter script from previous post and now timeline looks like this:<br />
<a href="http://www.developers-life.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-02-at-1.04.46-PM.png"><img src="http://www.developers-life.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-02-at-1.04.46-PM-188x300.png" alt="" title="twitter timeline on desktop mac os x" width="188" height="300" class="alignnone size-medium wp-image-1436" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/ansi-escape-sequences-for-coloring.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSTableView with custom header</title>
		<link>http://www.developers-life.com/nstableview-with-custom-header.html</link>
		<comments>http://www.developers-life.com/nstableview-with-custom-header.html#comments</comments>
		<pubDate>Sun, 22 Jan 2012 12:04:16 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[NSCell]]></category>
		<category><![CDATA[NSTableHeaderCell]]></category>
		<category><![CDATA[NSTableView]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1378</guid>
		<description><![CDATA[Default header looks like this First we want change height of header: 12NSTableHeaderView *tableHeaderView = &#91;&#91;NSTableHeaderView alloc&#93; initWithFrame:NSMakeRect&#40;0, 0, 120, 60&#41;&#93;; &#160; &#160; &#91;_tableView setHeaderView:tableHeaderView&#93;; Next step we want change NSTableHeaderCell, can make category for this class or make subclass. So, I wrote subclass. Empty category Rewrite method for change style 123456789101112131415161718192021@implementation NSTableHeaderCell &#40;VBNSTableHeaderCell&#41; - [...]]]></description>
			<content:encoded><![CDATA[<p>Default header looks like this<br />
<a href="http://www.developers-life.com/wp-content/uploads/2012/01/Screen-Shot-2012-01-22-at-1.25.57-PM.png"><img src="http://www.developers-life.com/wp-content/uploads/2012/01/Screen-Shot-2012-01-22-at-1.25.57-PM-300x227.png" alt="" title="Default header NSTableView" width="300" height="227" class="alignnone size-medium wp-image-1379" /></a></p>
<p>First we want change height of header:</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 /></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/ApplicationKit/Classes/NSTableHeaderView_Class/"><span style="color: #400080;">NSTableHeaderView</span></a> <span style="color: #002200;">*</span>tableHeaderView <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/ApplicationKit/Classes/NSTableHeaderView_Class/"><span style="color: #400080;">NSTableHeaderView</span></a> alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">120</span>, <span style="color: #2400d9;">60</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>_tableView setHeaderView<span style="color: #002200;">:</span>tableHeaderView<span style="color: #002200;">&#93;</span>;</div></td></tr></tbody></table></div>
<p>Next step we want change NSTableHeaderCell, can make category for this class or make subclass. So, I wrote subclass.</p>
<p>Empty category<br />
<a href="http://www.developers-life.com/wp-content/uploads/2012/01/Screen-Shot-2012-01-22-at-1.40.27-PM.png"><img src="http://www.developers-life.com/wp-content/uploads/2012/01/Screen-Shot-2012-01-22-at-1.40.27-PM-273x300.png" alt="" title="NSTableView with custom header" width="273" height="300" class="alignnone size-medium wp-image-1381" /></a><br />
<span id="more-1378"></span><br />
Rewrite method for change style</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 /></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;">@implementation</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTableHeaderCell_Class/"><span style="color: #400080;">NSTableHeaderCell</span></a> <span style="color: #002200;">&#40;</span>VBNSTableHeaderCell<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>drawWithFrame<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NSRect</span><span style="color: #002200;">&#41;</span>cellFrame inView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/"><span style="color: #400080;">NSView</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>controlView <span style="color: #002200;">&#123;</span><br />
<br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSMutableParagraphStyle_Class/"><span style="color: #400080;">NSMutableParagraphStyle</span></a> <span style="color: #002200;">*</span> aParagraphStyle <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/ApplicationKit/Classes/NSMutableParagraphStyle_Class/"><span style="color: #400080;">NSMutableParagraphStyle</span></a> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>aParagraphStyle setLineBreakMode<span style="color: #002200;">:</span>NSLineBreakByWordWrapping<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>aParagraphStyle setAlignment<span style="color: #002200;">:</span>NSCenterTextAlignment<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/"><span style="color: #400080;">NSMutableDictionary</span></a> <span style="color: #002200;">*</span>attrs <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/NSMutableDictionary_Class/"><span style="color: #400080;">NSMutableDictionary</span></a> dictionaryWithDictionary<span style="color: #002200;">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self attributedStringValue<span style="color: #002200;">&#93;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;attributesAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;effectiveRange<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mutableCopy<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>attrs setObject<span style="color: #002200;">:</span>aParagraphStyle forKey<span style="color: #002200;">:</span>NSParagraphStyleAttributeName<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSGradient_Class/"><span style="color: #400080;">NSGradient</span></a> <span style="color: #002200;">*</span>grayGradient <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/ApplicationKit/Classes/NSGradient_Class/"><span style="color: #400080;">NSGradient</span></a> alloc<span style="color: #002200;">&#93;</span> initWithColorsAndLocations<span style="color: #002200;">:</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> colorWithDeviceWhite<span style="color: #002200;">:</span><span style="color: #2400d9;">0.95</span> alpha<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>, <span style="color: #2400d9;">0.1</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> colorWithDeviceWhite<span style="color: #002200;">:</span><span style="color: #2400d9;">0.5</span> alpha<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>, <span style="color: #2400d9;">0.9</span>, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>grayGradient drawInRect<span style="color: #002200;">:</span>cellFrame angle<span style="color: #002200;">:</span><span style="color: #2400d9;">90</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self stringValue<span style="color: #002200;">&#93;</span> drawInRect<span style="color: #002200;">:</span>cellFrame withAttributes<span style="color: #002200;">:</span>attrs<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><a href="http://www.developers-life.com/wp-content/uploads/2012/01/Screen-Shot-2012-01-22-at-2.00.52-PM.png"><img src="http://www.developers-life.com/wp-content/uploads/2012/01/Screen-Shot-2012-01-22-at-2.00.52-PM-300x196.png" alt="" title="NSTableView with custom header, result" width="300" height="196" class="alignnone size-medium wp-image-1383" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/nstableview-with-custom-header.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSRegularExpression sample for comment syntax highlighting</title>
		<link>http://www.developers-life.com/nsregularexpression-sample-for-comment-syntax-highlighting.html</link>
		<comments>http://www.developers-life.com/nsregularexpression-sample-for-comment-syntax-highlighting.html#comments</comments>
		<pubDate>Tue, 08 Nov 2011 00:25:10 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[matchesInString]]></category>
		<category><![CDATA[NSRegularExpression]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[RegExp]]></category>
		<category><![CDATA[regexpal]]></category>
		<category><![CDATA[regularExpressionWithPattern]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[Кодинг]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1321</guid>
		<description><![CDATA[I have this text: 1word1 word2 &#34; word3 //&#34; word4 I wrote simple solution. I know it can be better. I know about Back Reference, but i don&#8217;t have experience with it. 123456789101112131415161718192021222324252627282930313233NSRegularExpression *expression = &#91;NSRegularExpression regularExpressionWithPattern:@&#34;((@\&#34;&#124;\&#34;).*?(\&#34;))&#34; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>I have this text:</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">word1 word2 <span style="color: #bf1d1a;">&quot; word3 //&quot;</span> word4</div></td></tr></tbody></table></div>
<p>I wrote simple solution. I know it can be better. I know about Back Reference, but i don&#8217;t have experience with it.</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 /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">NSRegularExpression <span style="color: #002200;">*</span>expression <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>NSRegularExpression regularExpressionWithPattern<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;((@<span style="color: #2400d9;">\&quot;</span>|<span style="color: #2400d9;">\&quot;</span>).*?(<span style="color: #2400d9;">\&quot;</span>))&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options<span style="color: #002200;">:</span>NSRegularExpressionDotMatchesLineSeparators <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span style="color: #400080;">NSArray</span></a> <span style="color: #002200;">*</span>textArray <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>expression matchesInString<span style="color: #002200;">:</span>textString options<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> range<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #002200;">&#91;</span>textString length<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
<br />
<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>NSTextCheckingResult <span style="color: #002200;">*</span>result <span style="color: #a61390;">in</span> textArray<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// set color for range</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<br />
<span style="color: #11740a; font-style: italic;">// Comments</span><br />
expression <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>NSRegularExpression regularExpressionWithPattern<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;(//[^<span style="color: #2400d9;">\&quot;</span><span style="color: #2400d9;">\n</span>]*)&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
<br />
<a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span style="color: #400080;">NSArray</span></a> <span style="color: #002200;">*</span> arrayComments <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>expression matchesInString<span style="color: #002200;">:</span>textString options<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> range<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #002200;">&#91;</span>textString length<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
<br />
<span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>NSTextCheckingResult <span style="color: #002200;">*</span>resultComment <span style="color: #a61390;">in</span> arrayComments<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #a61390;">BOOL</span> inside <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span>NSTextCheckingResult <span style="color: #002200;">*</span>resultText <span style="color: #a61390;">in</span> textArray<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; NSInteger from <span style="color: #002200;">=</span> resultText.range.location;<br />
&nbsp; &nbsp; &nbsp; &nbsp; NSInteger to <span style="color: #002200;">=</span> resultText.range.location<span style="color: #002200;">+</span>resultText.range.length;<br />
&nbsp; &nbsp; &nbsp; &nbsp; NSInteger now <span style="color: #002200;">=</span> resultComment.range.location;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>from &lt; now <span style="color: #002200;">&amp;&amp;</span> now &lt; to<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inside <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>inside<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// set color for range</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/nsregularexpression-sample-for-comment-syntax-highlighting.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DDProgressView &#8211; Custom Progress View</title>
		<link>http://www.developers-life.com/ddprogressview-custom-progress-view.html</link>
		<comments>http://www.developers-life.com/ddprogressview-custom-progress-view.html#comments</comments>
		<pubDate>Sat, 05 Nov 2011 15:47:23 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[others]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1310</guid>
		<description><![CDATA[DDProgressView is a custom progress view à la Twitter for iPhone. DDProgressView works on both iOS and Mac OS. You must also compile the AppKitCompatibility.m file when targeting Mac OS. Thanks, Damien DeVille!]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>DDProgressView</strong> is a custom progress view à la Twitter for iPhone.</p>
<p>DDProgressView works on both iOS and Mac OS. You must also compile the AppKitCompatibility.m file when targeting Mac OS.</p>
<p><img class="alignnone" title="DDProgressView" src="https://github.com/ddeville/DDProgressView/raw/master/Screenshot2.png" alt="" width="303" height="154" /></p>
<p><img class="alignnone" src="https://github.com/0xced/DDProgressView/raw/master/Screenshot.png" alt="" width="320" height="65" /></p>
<p><a href="https://github.com/ddeville/DDProgressView"><img class="alignnone size-full wp-image-1257" title="github-logo-80px" src="http://www.developers-life.com/wp-content/uploads/2011/08/github-logo-80px.png" alt="" width="130" height="80" /></a></p></blockquote>
<p>Thanks, <noindex><a href="http://www.ddeville.me/" target="_blank">Damien DeVille</a></noindex>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/ddprogressview-custom-progress-view.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Geo&#8221; renamed to &#8220;Photo Info Editor&#8221;</title>
		<link>http://www.developers-life.com/geo-photo-info-editor.html</link>
		<comments>http://www.developers-life.com/geo-photo-info-editor.html#comments</comments>
		<pubDate>Sun, 21 Aug 2011 21:17:26 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[others]]></category>
		<category><![CDATA[Geo]]></category>
		<category><![CDATA[Info]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Metadata]]></category>
		<category><![CDATA[Nikkon]]></category>
		<category><![CDATA[Photo]]></category>
		<category><![CDATA[Sparkle]]></category>
		<category><![CDATA[Tag]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1284</guid>
		<description><![CDATA[&#8220;Geo&#8221; renamed to &#8220;Photo Info Editor&#8221; alpha 1.0.1 Added Sparkle updater. Download Photo taken on Nikkon photo cam without GPS. Original date in NSDatePicker of photo.]]></description>
			<content:encoded><![CDATA[<p>&#8220;Geo&#8221; renamed to &#8220;Photo Info Editor&#8221; alpha 1.0.1</p>
<p>Added Sparkle updater.</p>
<p><img class="alignnone" src="http://gyazo.com/4198a9d942d98f09005715c942d6231d.png" alt="" width="409" height="355" /></p>
<p><a href="http://goo.gl/TYJDM" target="_blank"><span style="color: #ff0000;">Download</span></a></p>
<p>Photo taken on Nikkon photo cam without GPS. Original date in NSDatePicker of photo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/geo-photo-info-editor.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Get Geo tags from image</title>
		<link>http://www.developers-life.com/get-geo-tags-from-image.html</link>
		<comments>http://www.developers-life.com/get-geo-tags-from-image.html#comments</comments>
		<pubDate>Wed, 17 Aug 2011 22:22:44 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[Geo]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Position]]></category>
		<category><![CDATA[Tag]]></category>
		<category><![CDATA[Ukraine]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1274</guid>
		<description><![CDATA[Little application for getting geo location from photo Download Application]]></description>
			<content:encoded><![CDATA[<p>Little application for getting geo location from photo</p>
<p><a href="http://www.developers-life.com/wp-content/uploads/2011/08/Screen-Shot-2011-08-18-at-1.04.33-AM.png"><img class="alignnone size-full wp-image-1277" title="Screen Shot 2011-08-18 at 1.04.33 AM" src="http://www.developers-life.com/wp-content/uploads/2011/08/Screen-Shot-2011-08-18-at-1.04.33-AM.png" alt="" width="247" height="331" /></a></p>
<p><span id="more-1274"></span><br />
<strong><a href="http://goo.gl/ewF3q" target="_blank"><span style="color: #ff0000;">Download Application</span></a></strong></p>
<p><a href="http://www.developers-life.com/wp-content/uploads/2011/08/Screen-Shot-2011-08-18-at-1.04.27-AM.png"><img class="alignnone size-full wp-image-1276" title="Screen Shot 2011-08-18 at 1.04.27 AM" src="http://www.developers-life.com/wp-content/uploads/2011/08/Screen-Shot-2011-08-18-at-1.04.27-AM.png" alt="" width="383" height="324" /></a></p>
<p><a href="http://www.developers-life.com/wp-content/uploads/2011/08/Screen-Shot-2011-08-18-at-1.04.19-AM.png"><img class="alignnone size-full wp-image-1275" title="Screen Shot 2011-08-18 at 1.04.19 AM" src="http://www.developers-life.com/wp-content/uploads/2011/08/Screen-Shot-2011-08-18-at-1.04.19-AM.png" alt="" width="357" height="248" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/get-geo-tags-from-image.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MAAttachedWindow from Matt Gemmell</title>
		<link>http://www.developers-life.com/maattachedwindow-from-matt-gemmell.html</link>
		<comments>http://www.developers-life.com/maattachedwindow-from-matt-gemmell.html#comments</comments>
		<pubDate>Sat, 16 Jul 2011 09:56:18 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[AttachedWindow]]></category>
		<category><![CDATA[NSWindow]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1249</guid>
		<description><![CDATA[Nice window! Thanks, Matt Legend Gemmell! I us it in my apps, good solution! :) A cool NSWindow subclass which lets you easily attach a view to another window, displayed in a floating “speech-bubble”-like borderless window. Very handy for contextual help, showing options for a certain control, or just to draw attention to things. Have [...]]]></description>
			<content:encoded><![CDATA[<p>Nice window! <noindex>Thanks, <a href="http://mattgemmell.com/source" target="_blank">Matt Legend Gemmell</a>! I us it in my apps, good solution! :)</p>
<p><img alt="" src="http://mattgemmell.com/files/source/previews/blog_attachedwindow.png" title="Attached Window" class="alignnone" width="440" height="150" /><br />
</noindex><br />
A cool NSWindow subclass which lets you easily attach a view to another window, displayed in a floating “speech-bubble”-like borderless window. Very handy for contextual help, showing options for a certain control, or just to draw attention to things. Have a look at this screenshot to see how it works. You can also grab a project showing how to use an MAAttachedWindow with an NSStatusItem.<br />
Note: this project requires Xcode 2.4 and Mac OS X 10.4 (Tiger) or later, but should work on previous versions of Mac OS X if you include the files in your own project.</p>
<p><noindex> <a href="http://mattgemmell.com/files/source/maattachedwindow.zip" target="_blank">Sources Code</a> </noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/maattachedwindow-from-matt-gemmell.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Custom message Box</title>
		<link>http://www.developers-life.com/custom-message-box.html</link>
		<comments>http://www.developers-life.com/custom-message-box.html#comments</comments>
		<pubDate>Thu, 14 Jul 2011 21:10:40 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[others]]></category>
		<category><![CDATA[NSGraphicsContext]]></category>
		<category><![CDATA[NSView]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1244</guid>
		<description><![CDATA[Custom message box on Cocoa, like iOS messsge bubbles! We need NSView and 5 minutes :) Simple drawing bubble control 1234567891011121314151617181920212223242526272829303132333435363738394041424344&#160; &#160; &#91;NSGraphicsContext saveGraphicsState&#93;; &#160; &#160; &#160; &#160; &#91;&#91;NSColor whiteColor&#93; set&#93;; &#160; &#160; NSRectFill&#40;frameRect&#41;; &#160; &#160; &#160; &#160; /* Draw Shadow */ &#160; &#160; NSShadow *shadow = &#91;&#91;NSShadow alloc&#93; init&#93;; &#160; &#160; &#91;shadow setShadowColor:&#91;&#91;NSColor blackColor&#93; [...]]]></description>
			<content:encoded><![CDATA[<p>Custom message box on Cocoa, like iOS messsge bubbles!</p>
<p><img class="alignnone" title="custom message box objective-c" src="http://gyazo.com/b113756d3e09c1ffe1db8afaf9246c8e.png" alt="" width="458" height="493" /></p>
<p><span id="more-1244"></span></p>
<p>We need NSView and 5 minutes :)<br />
Simple drawing bubble control</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 />42<br />43<br />44<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSGraphicsContext_Class/"><span style="color: #400080;">NSGraphicsContext</span></a> saveGraphicsState<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> whiteColor<span style="color: #002200;">&#93;</span> set<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; NSRectFill<span style="color: #002200;">&#40;</span>frameRect<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">/* Draw Shadow */</span><br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSShadow_Class/"><span style="color: #400080;">NSShadow</span></a> <span style="color: #002200;">*</span>shadow <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/ApplicationKit/Classes/NSShadow_Class/"><span style="color: #400080;">NSShadow</span></a> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>shadow setShadowColor<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/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> blackColor<span style="color: #002200;">&#93;</span> colorWithAlphaComponent<span style="color: #002200;">:</span><span style="color: #2400d9;">0.5</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>shadow setShadowOffset<span style="color: #002200;">:</span>NSMakeSize<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">3.0</span>, <span style="color: #002200;">-</span><span style="color: #2400d9;">3.0</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>shadow setShadowBlurRadius<span style="color: #002200;">:</span><span style="color: #2400d9;">2.5</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>shadow set<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">/* Draw Control */</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">NSRect</span> myRect <span style="color: #002200;">=</span> NSMakeRect<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">95</span>, <span style="color: #2400d9;">10</span>, frameRect.size.width <span style="color: #002200;">-</span> <span style="color: #2400d9;">115</span>, frameRect.size.height<span style="color: #002200;">-</span><span style="color: #2400d9;">20</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class/"><span style="color: #400080;">NSBezierPath</span></a> <span style="color: #002200;">*</span>path <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSBezierPath_Class/"><span style="color: #400080;">NSBezierPath</span></a> bezierPath<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>path setLineJoinStyle<span style="color: #002200;">:</span>NSRoundLineJoinStyle<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>path appendBezierPathWithRoundedRect<span style="color: #002200;">:</span>myRect xRadius<span style="color: #002200;">:</span><span style="color: #2400d9;">8.0</span> yRadius<span style="color: #002200;">:</span><span style="color: #2400d9;">8.0</span><span style="color: #002200;">&#93;</span>; &nbsp; &nbsp;<br />
<br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Draw arrow</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>path moveToPoint<span style="color: #002200;">:</span>NSMakePoint<span style="color: #002200;">&#40;</span>frameRect.size.width<span style="color: #002200;">-</span><span style="color: #2400d9;">95</span>, frameRect.size.height<span style="color: #002200;">-</span><span style="color: #2400d9;">20</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>path lineToPoint<span style="color: #002200;">:</span>NSMakePoint<span style="color: #002200;">&#40;</span>frameRect.size.width<span style="color: #002200;">-</span><span style="color: #2400d9;">80</span>, frameRect.size.height<span style="color: #002200;">-</span><span style="color: #2400d9;">30</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>path lineToPoint<span style="color: #002200;">:</span>NSMakePoint<span style="color: #002200;">&#40;</span>frameRect.size.width<span style="color: #002200;">-</span><span style="color: #2400d9;">95</span>, frameRect.size.height<span style="color: #002200;">-</span><span style="color: #2400d9;">40</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">float</span> red <span style="color: #002200;">=</span> <span style="color: #2400d9;">0.5</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">float</span> green <span style="color: #002200;">=</span> <span style="color: #2400d9;">0.5</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">float</span> blue <span style="color: #002200;">=</span> <span style="color: #2400d9;">0.5</span>; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> <span style="color: #002200;">*</span>startingColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> colorWithCalibratedRed<span style="color: #002200;">:</span>red<span style="color: #002200;">+</span>0.3f<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;green<span style="color: #002200;">:</span>green<span style="color: #002200;">+</span>0.3f<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blue<span style="color: #002200;">:</span>blue<span style="color: #002200;">+</span>0.3f<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;alpha<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> <span style="color: #002200;">*</span>endingColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> colorWithCalibratedRed<span style="color: #002200;">:</span>red<span style="color: #002200;">-</span>0.05f<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;green<span style="color: #002200;">:</span>green<span style="color: #002200;">-</span>0.05f<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; blue<span style="color: #002200;">:</span>blue<span style="color: #002200;">-</span>0.05f<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;alpha<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSGradient_Class/"><span style="color: #400080;">NSGradient</span></a> <span style="color: #002200;">*</span>gradient <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSGradient_Class/"><span style="color: #400080;">NSGradient</span></a> alloc<span style="color: #002200;">&#93;</span> initWithStartingColor<span style="color: #002200;">:</span>startingColor<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; endingColor<span style="color: #002200;">:</span>endingColor<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>path fill<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>gradient drawInBezierPath<span style="color: #002200;">:</span>path angle<span style="color: #002200;">:-</span><span style="color: #2400d9;">90</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSGraphicsContext_Class/"><span style="color: #400080;">NSGraphicsContext</span></a> restoreGraphicsState<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>shadow release<span style="color: #002200;">&#93;</span>;</div></td></tr></tbody></table></div>
<p><a href='http://www.developers-life.com/wp-content/uploads/2011/07/MessageBox.zip' target="_blank">MessageBox sources</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/custom-message-box.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting the text color of an NSButton</title>
		<link>http://www.developers-life.com/setting-the-text-color-of-an-nsbutton.html</link>
		<comments>http://www.developers-life.com/setting-the-text-color-of-an-nsbutton.html#comments</comments>
		<pubDate>Wed, 20 Apr 2011 18:59:05 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[NSButton]]></category>
		<category><![CDATA[NSColor]]></category>
		<category><![CDATA[NSMutableAttributedString]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1219</guid>
		<description><![CDATA[Here’s a simple little category on NSButton which adds -textColor and -setTextColor: methods to the class. Header: 1234567#import &#60;Cocoa/Cocoa.h&#62; @interface NSButton &#40;TextColor&#41; - &#40;NSColor *&#41;textColor; - &#40;void&#41;setTextColor:&#40;NSColor *&#41;textColor; @end Implementation: 12345678910111213141516171819202122232425262728293031#import &#34;NSButton+TextColor.h&#34; @implementation NSButton &#40;TextColor&#41; - &#40;NSColor *&#41;textColor &#123; &#160; &#160; NSAttributedString *attrTitle = &#91;self attributedTitle&#93;; &#160; &#160; int len = &#91;attrTitle length&#93;; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Here’s a simple little category on NSButton which adds -textColor and -setTextColor: methods to the class.</p>
<p>Header:</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: #6e371a;">#import &lt;Cocoa/Cocoa.h&gt;</span><br />
<span style="color: #a61390;">@interface</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSButton_Class/"><span style="color: #400080;">NSButton</span></a> <span style="color: #002200;">&#40;</span>TextColor<span style="color: #002200;">&#41;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>textColor;<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setTextColor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>textColor;<br />
<br />
<span style="color: #a61390;">@end</span></div></td></tr></tbody></table></div>
<p>Implementation:</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 /></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 &quot;NSButton+TextColor.h&quot;</span><br />
<span style="color: #a61390;">@implementation</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSButton_Class/"><span style="color: #400080;">NSButton</span></a> <span style="color: #002200;">&#40;</span>TextColor<span style="color: #002200;">&#41;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>textColor<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSAttributedString_Class/"><span style="color: #400080;">NSAttributedString</span></a> <span style="color: #002200;">*</span>attrTitle <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>self attributedTitle<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">int</span> len <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>attrTitle length<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">NSRange</span> range <span style="color: #002200;">=</span> NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, MIN<span style="color: #002200;">&#40;</span>len, <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>; <span style="color: #11740a; font-style: italic;">// take color from first char</span><br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/"><span style="color: #400080;">NSDictionary</span></a> <span style="color: #002200;">*</span>attrs <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>attrTitle fontAttributesInRange<span style="color: #002200;">:</span>range<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> <span style="color: #002200;">*</span>textColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> controlTextColor<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>attrs<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; textColor <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>attrs objectForKey<span style="color: #002200;">:</span>NSForegroundColorAttributeName<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">return</span> textColor;<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>setTextColor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSColor_Class/"><span style="color: #400080;">NSColor</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>textColor<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSMutableAttributedString_Class/"><span style="color: #400080;">NSMutableAttributedString</span></a> <span style="color: #002200;">*</span>attrTitle <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/NSMutableAttributedString_Class/"><span style="color: #400080;">NSMutableAttributedString</span></a> alloc<span style="color: #002200;">&#93;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;initWithAttributedString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>self attributedTitle<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">int</span> len <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>attrTitle length<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">NSRange</span> range <span style="color: #002200;">=</span> NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, len<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>attrTitle addAttribute<span style="color: #002200;">:</span>NSForegroundColorAttributeName <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value<span style="color: #002200;">:</span>textColor <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; range<span style="color: #002200;">:</span>range<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>attrTitle fixAttributesInRange<span style="color: #002200;">:</span>range<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self setAttributedTitle<span style="color: #002200;">:</span>attrTitle<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>attrTitle release<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #a61390;">@end</span></div></td></tr></tbody></table></div>
<p><noindex><a href="http://www.pastebuffer.com/2007/10/04/setting-the-text-color-of-an-nsbutton/">source</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/setting-the-text-color-of-an-nsbutton.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>
	</channel>
</rss>

