<?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; OOP</title>
	<atom:link href="http://www.developers-life.com/tag/oop/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>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>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>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>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>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>Основы 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>Integrate High Scores service of mob1serv</title>
		<link>http://www.developers-life.com/integrate-high-scores-service-of-mob1serv.html</link>
		<comments>http://www.developers-life.com/integrate-high-scores-service-of-mob1serv.html#comments</comments>
		<pubDate>Mon, 08 Nov 2010 15:32:14 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mob1serv]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[others]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1143</guid>
		<description><![CDATA[Для начала нужно немного ознакомиться на сайте mob1serv как это работает. Скачать либу с сайта или которую собрал я, немного модифицированную, добавил пару расширений. В мой версии также вложен пример с сайта mob1serv. Начнем&#8230; 1. Нам нужно проверить интернет соединение, лучше всего воспользоваться Reachability, уже готовым решением от разработчиков Apple. На этом моменте останавливаться не [...]]]></description>
			<content:encoded><![CDATA[<p>Для начала нужно немного ознакомиться на сайте <a href="http://www.mob1serv.com/high-scores/" target="blank">mob1serv</a> как это работает.</p>
<p>Скачать либу с <a href="http://mob1serv.com/downloads/library/HighscoresLibPackage.zip" target="blank">сайта</a> или которую <a href="http://depositfiles.com/files/bnmp5giee" target="blank">собрал я</a>, немного модифицированную, добавил пару расширений. В мой версии также вложен <a href="http://mob1serv.com/downloads/sample_projects/HighscoresTestExample.zip" target="blank">пример</a> с сайта mob1serv.</p>
<p>Начнем&#8230;</p>
<p>1. Нам нужно проверить интернет соединение, лучше всего воспользоваться <a href="http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html" target="blank">Reachability</a>, уже готовым решением от разработчиков Apple. На этом моменте останавливаться не будем, в примере все показано.</p>
<p>2. Перед тем как мы будем работать непосредственно с API либы, продемострирую как ее подключить к проекту<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/Ion6xx4cJg8?hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/Ion6xx4cJg8?hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><span id="more-1143"></span><br />
3. Необходимо зайти на admin.mob1serv.com и создать учетную запись.<br />
- войти и создать новое приложение, нажав на &#8220;+ Add a new Application&#8221;;<br />
- выбрать HighScores -&gt; Edit game modes и обавить mode;<br />
<a href="http://gyazo.com/47b57c8d30195091bdba8a5749eb66cc.png"><img src="http://gyazo.com/47b57c8d30195091bdba8a5749eb66cc.png" alt="" width="294" height="118" /></a><br />
- перейти на вкладку Connection Info и узнать информацию для подключения.<br />
<a href="http://gyazo.com/9eafb8c9c76106b930ad0c292cbc815a.png"><img src="http://gyazo.com/9eafb8c9c76106b930ad0c292cbc815a.png" alt="" width="334" height="204" /></a></p>
<p>4. Вот теперь начнем писать код.</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 />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<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> subscribe <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>informationGettedNotificationReceived<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> name<span style="color: #002200;">:</span>kHighScoresNotificationInformatioGetted object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>successNotificationReceived<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> name<span style="color: #002200;">:</span>kMobservNotificationAccessTokenReceived object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>errorNotificationReceived<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> name<span style="color: #002200;">:</span>kMobservNotificationAccessTokenReceiveFailed object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>scoreAddedNotificationReceived<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> name<span style="color: #002200;">:</span>kHighScoresNotificationScoreAdded object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>scoreGettedNotificationReceived<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> name<span style="color: #002200;">:</span>kHighScoresNotificationScoreGetted object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;subscribed <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</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> unsubscribe <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> removeObserver<span style="color: #002200;">:</span>self name<span style="color: #002200;">:</span>kHighScoresNotificationInformatioGetted object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> removeObserver<span style="color: #002200;">:</span>self name<span style="color: #002200;">:</span>kMobservNotificationAccessTokenReceived object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> removeObserver<span style="color: #002200;">:</span>self name<span style="color: #002200;">:</span>kMobservNotificationAccessTokenReceiveFailed object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> removeObserver<span style="color: #002200;">:</span>self name<span style="color: #002200;">:</span>kHighScoresNotificationScoreAdded object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> removeObserver<span style="color: #002200;">:</span>self name<span style="color: #002200;">:</span>kHighScoresNotificationScoreGetted object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;subscribed <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<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 />9<br />10<br />11<br />12<br />13<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 limitScores 25</span><br />
<br />
<span style="color: #6e371a;">#define mAppID 200</span><br />
<span style="color: #6e371a;">#define mGameID 400 // Ваш game id</span><br />
<span style="color: #6e371a;">#define mConsumerKey @&quot;sdfsadfjoisdf&quot;</span><br />
<span style="color: #6e371a;">#define mSecretKey @&quot;sdfsadfjoisdf&quot;</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> connect <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;HighScoresService<span style="color: #002200;">*</span> hScore <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>HighScoresService sharedInstance<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;hScore.appid <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/"><span style="color: #400080;">NSNumber</span></a> numberWithInt<span style="color: #002200;">:</span>mAppID<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>hScore setConsumerKey<span style="color: #002200;">:</span>mConsumerKey andSecret<span style="color: #002200;">:</span>mSecretKey<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>hScore getAccessToken<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<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"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>successNotificationReceived<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotification_Class/"><span style="color: #400080;">NSNotification</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>self refreshResults<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>refreshResults <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>scores removeAllObjects<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">// array</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#40;</span>HighScoresService<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>HighScoresService sharedInstance<span style="color: #002200;">&#93;</span> getScoresForGame<span style="color: #002200;">:</span>mGameID scoreLimit<span style="color: #002200;">:</span>limitScores<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<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 />9<br />10<br />11<br />12<br />13<br />14<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>informationGettedNotificationReceived<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotification_Class/"><span style="color: #400080;">NSNotification</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #11740a; font-style: italic;">// так я сохраняю информацию о запросе</span><br />
&nbsp; &nbsp; &nbsp;self.dictInfo <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><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><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>notification.userInfo objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;info&quot;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #11740a; font-style: italic;">// получаю количество записей всего</span><br />
&nbsp; &nbsp; &nbsp;totalCount <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self.dictInfo objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;total_count&quot;</span><span style="color: #002200;">&#93;</span> intValue<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// получаем скоры</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>scoreGettedNotificationReceived<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotification_Class/"><span style="color: #400080;">NSNotification</span></a><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #11740a; font-style: italic;">// get scores and insert ot array</span><br />
&nbsp; &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> dict <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><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><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>notification.userInfo objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;result&quot;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;scores <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/NSMutableArray_Class/"><span style="color: #400080;">NSMutableArray</span></a> alloc<span style="color: #002200;">&#93;</span> initWithArray<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>dict objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;scores&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;...<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<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 /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HighScore<span style="color: #002200;">*</span> score <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>HighScore alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;<br />
score.index <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/"><span style="color: #400080;">NSNumber</span></a> numberWithInt<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;<br />
score.limit <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/"><span style="color: #400080;">NSNumber</span></a> numberWithInt<span style="color: #002200;">:</span>limitScores<span style="color: #002200;">&#93;</span>;<br />
score.userName <span style="color: #002200;">=</span> name;<br />
score.value <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/"><span style="color: #400080;">NSNumber</span></a> numberWithInt<span style="color: #002200;">:</span>score<span style="color: #002200;">&#93;</span>;<br />
score.subgameId <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span style="color: #400080;">NSString</span></a> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%d&quot;</span>,mGameID<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>HighScoresService sharedInstance<span style="color: #002200;">&#93;</span> addScore<span style="color: #002200;">:</span>score<span style="color: #002200;">&#93;</span>;</div></td></tr></tbody></table></div>
<p>В scoreAddedNotificationReceived:(NSNotification*)notification получим калбек с результатом добавления</p>
<p>Вот к примеру как можно получить следующие 25 результатов</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"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>loadMore25Scores <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>totalCount <span style="color: #002200;">!=</span> loadedScores<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>HighScoresService sharedInstance<span style="color: #002200;">&#93;</span> getScoresForGame<span style="color: #002200;">:</span>idGame <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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;scoreLimit<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>totalCount<span style="color: #002200;">-</span>limitScores &gt;<span style="color: #002200;">=</span> limitScores<span style="color: #002200;">&#41;</span>? limitScores <span style="color: #002200;">:</span> totalCount<span style="color: #002200;">-</span>loadedScores <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; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fromIndex<span style="color: #002200;">:</span>loadedScores <span style="color: #002200;">&#93;</span>; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loadedScores <span style="color: #002200;">+=</span> <span style="color: #002200;">&#40;</span>totalCount<span style="color: #002200;">-</span>limitScores &gt;<span style="color: #002200;">=</span> limitScores<span style="color: #002200;">&#41;</span>? limitScores <span style="color: #002200;">:</span> totalCount<span style="color: #002200;">-</span>loadedScores;<br />
&nbsp; &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/integrate-high-scores-service-of-mob1serv.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integrate Apple Game Center to BeerTender iPhone Game</title>
		<link>http://www.developers-life.com/integrate-apple-game-center-to-beertender-iphone-game.html</link>
		<comments>http://www.developers-life.com/integrate-apple-game-center-to-beertender-iphone-game.html#comments</comments>
		<pubDate>Wed, 03 Nov 2010 17:18:49 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Game]]></category>
		<category><![CDATA[Game Center]]></category>
		<category><![CDATA[GameKit]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mob1serv]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1124</guid>
		<description><![CDATA[Hello English version comming soon&#8230; Предварительно: В игре BeerTender интегрированны дополнительно онлайн скоры от mob1serv, что позволяет отображать результат игры и на других версия iOS и даже на других платформах что бывает не мало важно! Прочитав документацию от apple принялся за дело. Большинство блоков кода взято из примеров приведенных в документации. Перед началом работы непосредственно [...]]]></description>
			<content:encoded><![CDATA[<p>Hello</p>
<p>English version comming soon&#8230;</p>
<p>Предварительно:<br />
В игре BeerTender интегрированны дополнительно онлайн скоры от <a href="http://www.mob1serv.com/" target="blank">mob1serv</a>, что позволяет отображать результат игры и на других версия  iOS и даже на <strong>других платформах</strong> что бывает не мало важно!</p>
<p>Прочитав документацию от apple принялся за дело. Большинство блоков кода взято из примеров приведенных в документации. </p>
<p>Перед началом работы непосредственно с кодом в среде xCode, необходимо войти в itunesconnect и проделать следующие действия:<br />
 &#8211; включить в приложении  Game Cente;<br />
 &#8211; добавить и настроить Leaderboard;<br />
 &#8211; добавить локализацию;<br />
 &#8211; по желанию добавить Achievements.</p>
<p>Для начала необходимо добавить фреймворк <strong>GameKit</strong> и проверить наличие Game Center на девайсе и версию iOS.</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 /></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; GameKit/GameKit.h&gt;</span><br />
<br />
<span style="color: #a61390;">BOOL</span> isGameCenterAvailable<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Check for presence of GKLocalPlayer API.</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">Class</span> gcClass <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>NSClassFromString<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GKLocalPlayer&quot;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// The device must be running running iOS 4.1 or later.</span><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>reqSysVer <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;4.1&quot;</span>;<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>currSysVer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> systemVersion<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">BOOL</span> osVersionSupported <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>currSysVer compare<span style="color: #002200;">:</span>reqSysVer options<span style="color: #002200;">:</span>NSNumericSearch<span style="color: #002200;">&#93;</span> <span style="color: #002200;">!=</span> NSOrderedAscending<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #a61390;">return</span> <span style="color: #002200;">&#40;</span>gcClass <span style="color: #002200;">&amp;&amp;</span> osVersionSupported<span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>Создаем метод в котором запускается прослушивание уведомлений/нотификаций аутерефикации пользователя и метод собственно запускающего аутерификацию.<br />
<span id="more-1124"></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 />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 /></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> registerForAuthenticationNotification<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> <span style="color: #002200;">*</span>nc <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>nc addObserver<span style="color: #002200;">:</span> self<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>authenticationChanged<span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;name<span style="color: #002200;">:</span>GKPlayerAuthenticationDidChangeNotificationName<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><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> authenticateLocalPlayer<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>GKLocalPlayer localPlayer<span style="color: #002200;">&#93;</span> authenticateWithCompletionHandler<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/"><span style="color: #400080;">NSError</span></a> <span style="color: #002200;">*</span>error<span style="color: #002200;">&#41;</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>error <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><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: #11740a; font-style: italic;">// Insert code here to handle a successful authentication.</span><br />
&nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp;<span style="color: #11740a; font-style: italic;">// Your application can process the error parameter to report the error to the player.</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;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>После выполнения метода <strong>authenticateLocalPlayer</strong> на экране будет представлена следующая картина:<br />
<a href="http://gyazo.com/4275c590fd245edd5e79181f4f9e99ea.png" target="blank"><img class="alignnone" title="snadbox game center beertender" src="http://gyazo.com/4275c590fd245edd5e79181f4f9e99ea.png" alt="" width="133" height="250" /></a></p>
<p>Войдя в систему, приложение получет уведомление в метод <strong>authenticationChanged</strong>, которым мы слушаем нотификации с именем GKPlayerAuthenticationDidChangeNotificationName:</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 /></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> authenticationChanged<br />
<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;">&#91;</span>GKLocalPlayer localPlayer<span style="color: #002200;">&#93;</span>.isAuthenticated<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;isAuthenticated %@&quot;</span>, <span style="color: #002200;">&#91;</span>GKLocalPlayer localPlayer<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Insert code here to handle a successful authentication.</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; <span style="color: #11740a; font-style: italic;">// Insert code here to clean up any outstanding Game Center-related classes.</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>Добавить результат в Leaderboard и просмотреть результаты достаточно просто:</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 /></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> reportScore<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span>int64_t<span style="color: #002200;">&#41;</span> score forCategory<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> category<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; GKScore <span style="color: #002200;">*</span>scoreReporter <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>GKScore alloc<span style="color: #002200;">&#93;</span> initWithCategory<span style="color: #002200;">:</span>category<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; scoreReporter.value <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>int64_t<span style="color: #002200;">&#41;</span>score;<br />
<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>scoreReporter reportScoreWithCompletionHandler<span style="color: #002200;">:^</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/"><span style="color: #400080;">NSError</span></a> <span style="color: #002200;">*</span>error<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>error <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// handle the reporting error</span><br />
&nbsp; &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;<span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// get scores </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> reloadHighScoresForCategory<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> category<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;GKLeaderboard<span style="color: #002200;">*</span> leaderBoard<span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>GKLeaderboard alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp;leaderBoard.category<span style="color: #002200;">=</span> category;<br />
&nbsp; &nbsp; &nbsp;leaderBoard.timeScope<span style="color: #002200;">=</span> GKLeaderboardTimeScopeAllTime;<br />
&nbsp; &nbsp; &nbsp;leaderBoard.range<span style="color: #002200;">=</span> NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">1</span>, <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span>;<br />
<br />
&nbsp; &nbsp; &nbsp;<span style="color: #002200;">&#91;</span>leaderBoard loadScoresWithCompletionHandler<span style="color: #002200;">:</span> &nbsp;<span style="color: #002200;">^</span><span style="color: #002200;">&#40;</span><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>scoress, <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/"><span style="color: #400080;">NSError</span></a> <span style="color: #002200;">*</span>error<span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot; scores %@&quot;</span>,scoress<span style="color: #002200;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>category &#8211; имя Leaderboard;<br />
score &#8211; результат игры.</p>
<p>Выполнив метод <strong>reloadHighScoresForCategory</strong> можно получить результаты игроков для указанного Leaderboard.</p>
<p>Просмотреть результаты игры можно приложив минимум усилий с помощью существующего стандартного контроллера GKLeaderboardViewController и с дизайном Game Center :)</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 /></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> showLeaderboard<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; GKLeaderboardViewController <span style="color: #002200;">*</span>leaderboardController <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>GKLeaderboardViewController alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>leaderboardController <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; leaderboardController.leaderboardDelegate <span style="color: #002200;">=</span> self;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>navController presentModalViewController<span style="color: #002200;">:</span> leaderboardController animated<span style="color: #002200;">:</span> <span style="color: #a61390;">YES</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 />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>leaderboardViewControllerDidFinish<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>GKLeaderboardViewController <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>viewController<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>navController dismissModalViewControllerAnimated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p><a href="http://gyazo.com/ecbc5c66058168f7f9274c5d161e9f78.png"><img class="alignnone" title="snadbox game center beertender" src="http://gyazo.com/ecbc5c66058168f7f9274c5d161e9f78.png" alt="" width="133" height="250" /></a></p>
<p>И не забудьте, в вашем таргете, на закладке General, в списке библеотек, указать Weak напротив GameKit.framework! Вот такая вот фигня :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/integrate-apple-game-center-to-beertender-iphone-game.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Add methods to obejct at runtime in Objective-C</title>
		<link>http://www.developers-life.com/add-methods-to-obejct-at-runtime-in-objective-c.html</link>
		<comments>http://www.developers-life.com/add-methods-to-obejct-at-runtime-in-objective-c.html#comments</comments>
		<pubDate>Tue, 02 Nov 2010 21:29:53 +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[asm]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Runtime]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=1107</guid>
		<description><![CDATA[Please, read this post for more understanding&#8230; Function for add method to object is class_addMethod Adds a new method to a class with a given name and implementation. 1BOOL class_addMethod&#40;Class cls, SEL name, IMP imp, const char *types&#41; Parameters cls &#160;&#160;&#160;&#160;The class to which to add a method. name &#160;&#160;&#160;&#160;A selector that specifies the name [...]]]></description>
			<content:encoded><![CDATA[<p>Please, read this <a href="http://cocoasamurai.blogspot.com/2010/01/understanding-objective-c-runtime.html" target="blank">post</a> for more understanding&#8230;</p>
<p>Function for add method to object is <strong>class_addMethod</strong></p>
<p>Adds a new method to a class with a given name and 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 /></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;">BOOL</span> class_addMethod<span style="color: #002200;">&#40;</span><span style="color: #a61390;">Class</span> cls, <span style="color: #a61390;">SEL</span> name, <span style="color: #a61390;">IMP</span> imp, <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>types<span style="color: #002200;">&#41;</span></div></td></tr></tbody></table></div>
<p>Parameters<br />
<em>cls</em><br />
&nbsp;&nbsp;&nbsp;&nbsp;The class to which to add a method.<br />
<em>name</em><br />
&nbsp;&nbsp;&nbsp;&nbsp;A selector that specifies the name of the method being added.<br />
<em>imp</em><br />
&nbsp;&nbsp;&nbsp;&nbsp;A function which is the implementation of the new method. The function must take at least two arguments—self and _cmd.<br />
<em>types</em><br />
&nbsp;&nbsp;&nbsp;&nbsp;An array of characters that describe the types of the arguments to the method. For possible values, see <a target="blank" href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008048">Objective-C Runtime Programming Guide</a> &gt; <a target="blank" href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html#//apple_ref/doc/uid/TP40008048-CH100-SW1">Type Encodings</a>. Since the function must take at least two arguments—<em>self</em> and <em>_cmd</em>, the second and third characters must be “<em>@:</em>” (the first character is the return type).<br />
Return Value<br />
&nbsp;&nbsp;&nbsp;&nbsp;<em>YES</em> if the method was added successfully, otherwise NO (for example, the class already contains a method implementation with that name).</p>
<p>Discussion<br />
<em>class_addMethod</em> will add an override of a superclass&#8217;s implementation, but will not replace an existing implementation in this class. To change an existing implementation, use <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/c/func/method_setImplementation" target="blank">method_setImplementation</a>.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;An Objective-C method is simply a C function that take at least two arguments—<em>self</em> and <em>_cmd</em>. For example, given the following function:</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"><span style="color: #a61390;">void</span> myMethodIMP<span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span> self, <span style="color: #a61390;">SEL</span> _cmd<span style="color: #002200;">&#41;</span><br />
<span style="color: #002200;">&#123;</span><br />
<span style="color: #11740a; font-style: italic;">// implementation ....</span><br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>you can dynamically add it to a class as a method (called <em>resolveThisMethodDynamically</em>) like this:</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">class_addMethod<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>self class<span style="color: #002200;">&#93;</span>, <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>resolveThisMethodDynamically<span style="color: #002200;">&#41;</span>, <span style="color: #002200;">&#40;</span><span style="color: #a61390;">IMP</span><span style="color: #002200;">&#41;</span> myMethodIMP, <span style="color: #bf1d1a;">&quot;v@:&quot;</span><span style="color: #002200;">&#41;</span>;</div></td></tr></tbody></table></div>
<p>Declared In<br />
runtime.h</p>
<p><span id="more-1107"></span></p>
<p>Let&#8217;s dig into the Objective-C runtime. There are two structures we need to deal with:</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 /></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;">struct</span> objc_method <span style="color: #002200;">&#123;</span><br />
&nbsp; <span style="color: #a61390;">SEL</span> method_name;<br />
&nbsp; <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>method_types;<br />
&nbsp; <span style="color: #a61390;">IMP</span> method_imp;<br />
<span style="color: #002200;">&#125;</span>;<br />
<br />
<span style="color: #a61390;">struct</span> objc_method_list <span style="color: #002200;">&#123;</span><br />
&nbsp; <span style="color: #a61390;">struct</span> objc_method_list <span style="color: #002200;">*</span>obsolete;<br />
&nbsp; <span style="color: #a61390;">int</span> method_count;<br />
&nbsp; <span style="color: #a61390;">struct</span> objc_method method_list<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span>;</div></td></tr></tbody></table></div>
<p>This looks kinda scary, but it&#8217;s actually not too bad. The steps are basically:</p>
<p>0. Make a function<br />
1. Create an objc_method instance<br />
2. Register the function name<br />
3. Give the objc_method a pointer to the function<br />
4. Add the objc_method to a objc_method_list<br />
5. Pass the objc_method_list to class_addMethods<br />
6. There is no step 6!</p>
<p>So here&#8217;s all the code to do that:</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 /></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;objc/objc-class.h&gt;</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// create a class with no methods</span><br />
<span style="color: #a61390;">@interface</span> EmptyClass <span style="color: #002200;">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span style="color: #400080;">NSObject</span></a> <span style="color: #002200;">&#123;</span> <span style="color: #002200;">&#125;</span><br />
<span style="color: #a61390;">@end</span><br />
<br />
<span style="color: #a61390;">@implementation</span> EmptyClass<br />
<span style="color: #a61390;">@end</span><br />
<br />
<span style="color: #11740a; font-style: italic;">// define the function to add as a method</span><br />
<span style="color: #a61390;">id</span> sayHello <span style="color: #002200;">&#40;</span> <span style="color: #a61390;">id</span> self, <span style="color: #a61390;">SEL</span> _cmd,... <span style="color: #002200;">&#41;</span><br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; NSLog <span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello&quot;</span><span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #a61390;">void</span> addMethod <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; <span style="color: #11740a; font-style: italic;">// create the method</span><br />
<br />
&nbsp; <span style="color: #a61390;">struct</span> objc_method myMethod;<br />
&nbsp; myMethod.method_name <span style="color: #002200;">=</span> sel_registerName<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;sayHello&quot;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; myMethod.method_imp &nbsp;<span style="color: #002200;">=</span> sayHello;<br />
&nbsp; <br />
&nbsp; <span style="color: #11740a; font-style: italic;">// build the method list.</span><br />
&nbsp; <span style="color: #11740a; font-style: italic;">// this memory needs to stick around as long as the</span><br />
&nbsp; <span style="color: #11740a; font-style: italic;">// methods belong to the class.</span><br />
<br />
&nbsp; <span style="color: #a61390;">struct</span> objc_method_list <span style="color: #002200;">*</span> myMethodList;<br />
&nbsp; myMethodList <span style="color: #002200;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/malloc.html"><span style="color: #a61390;">malloc</span></a> <span style="color: #002200;">&#40;</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><span style="color: #a61390;">struct</span> objc_method_list<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>;<br />
&nbsp; myMethodList<span style="color: #002200;">-</span>&gt;method_count <span style="color: #002200;">=</span> <span style="color: #2400d9;">1</span>;<br />
&nbsp; myMethodList<span style="color: #002200;">-</span>&gt;method_list<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">=</span> myMethod;<br />
&nbsp; <br />
&nbsp; <span style="color: #11740a; font-style: italic;">// add method to the class</span><br />
&nbsp; class_addMethods <span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span>EmptyClass class<span style="color: #002200;">&#93;</span>, myMethodList <span style="color: #002200;">&#41;</span>;<br />
&nbsp; <br />
&nbsp; <span style="color: #11740a; font-style: italic;">// try it out</span><br />
&nbsp; EmptyClass <span style="color: #002200;">*</span> instance <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>EmptyClass alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
&nbsp; <span style="color: #002200;">&#91;</span>instance sayHello<span style="color: #002200;">&#93;</span>;<br />
&nbsp; <span style="color: #002200;">&#91;</span>instance release<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p><strong>Resources:<br />
</strong><a href="http://theocacao.com/document.page/327" target="blank"> Theocacao &#8211; all typing by Scott Stevensov</a><br />
<a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html" target="blank">Objective-C Runtime Reference</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/add-methods-to-obejct-at-runtime-in-objective-c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

