注册 登录
主题 : 网络编程总结
级别: 新手上路
UID: 29631
精华: 1
发帖: 29
可可豆: 296 CB
威望: 296 点
在线时间: 157(时)
注册时间: 2010-09-03
最后登录: 2016-08-06
0 楼:  发表于: 2010-09-03 22:29    发自: Web Page
来源于 一般讨论 分类

网络编程总结   

管理提醒: 本帖被 gagaga 设置为精华(2011-01-18)
一:确认网络环境3G/WIFI taO(\FOm  
EV|W:;Sg  
    1. 添加源文件和framework Ufor>  
     {/48n83n  
    开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。 u6MU @?  
    Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部: FNo.#Z5+b  
     (W[]}k ;  
    1.1. 添加源文件: q{f (T\  
    在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图: '0I>  
GR 1%(,  
     <; 1M!.)5  
     S&J5QZjC  
    1.2.添加framework: j|XL$Q  
    将SystemConfiguration.framework 添加进工程。如下图: J 5xZL v  
     HTm`_}G9  
     xjrL@LO#  
    2. 网络状态 zpzxCzU  
     BV}sN{  
    Reachability.h中定义了三种网络状态: T&Z*=ShH  
    typedef enum { <l eE.hhf.  
        NotReachable = 0,            //无连接 )gAqWbkB  
        ReachableViaWiFi,            //使用3G/GPRS网络 K\mFb  
        ReachableViaWWAN            //使用WiFi网络 q:vGGK^  
    } NetworkStatus; Lnq CHe  
     @_ UI;*V  
    因此可以这样检查网络状态: [N"=rY4G  
,TYFPulYcp  
    Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”]; jQBn\^w  
    switch ([r currentReachabilityStatus]) { 7>A M zNj  
            case NotReachable: Pw6%,?lQ  
                    // 没有网络连接 7m:TY>{  
                    break; ~I~lb/  
            case ReachableViaWWAN: kD) ]\   
                    // 使用3G网络 \#F>R,  
                    break; m5, &;~  
            case ReachableViaWiFi: s'Qmr s a  
                    // 使用WiFi网络 nu2m5RYx  
                    break; E #!.;AQ  
    } 6X!jNh$oF  
     h&~9?B  
    3.检查当前网络环境 S/YHT)0x[  
    程序启动时,如果想检测可用的网络环境,可以像这样 u Qg$hS  
    // 是否wifi BE54L+$p  
    + (BOOL) IsEnableWIFI { -*kZ2grLt  
        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable); z$M-UxY  
    } :dxKcg7  
N0 mh gEA  
    // 是否3G xokA_3,1F  
    + (BOOL) IsEnable3G { <KE%|6oER  
        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable); .;(a;f+{;  
    } {j4&'=C:  
    例子: |A+,M"F?  
    - (void)viewWillAppear:(BOOL)animated {     ;*=7>"o'`  
    if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && Zt9ld=T  
            ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) { dh%DALZ8t  
            self.navigationItem.hidesBackButton = YES; 4i<GqG  
            [self.navigationItem setLeftBarButtonItem:nil animated:NO]; 9`KFJx6D  
        } tC.etoh  
    } %Z-xh< &  
XK;Vu#E*^  
    4. 链接状态的实时通知 O:imX>|u  
    网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户: #Kx @:I  
     GXRW"4eF5  
    Reachability 1.5版本 {z9z#8`C;  
    // My.AppDelegate.h [lu+"V,<LJ  
    #import "Reachability.h" SQ'%a-Mct  
l j+p}dt  
    @interface MyAppDelegate : NSObject <UIApplicationDelegate> { >ZU)bnndA  
        NetworkStatus remoteHostStatus; @3~W ukc  
    } *<}R=X.  
|Nadk(}  
    @property NetworkStatus remoteHostStatus; gtqtFrleG  
1{1mL-I;  
    @end A-rj: k!  
Z&7Yl(|  
    // My.AppDelegate.m }j!C+i  
    #import "MyAppDelegate.h" (CAkzgTfc  
y k\/Cf  
    @implementation MyAppDelegate Fzn !  
    @synthesize remoteHostStatus; mXyg\5  
APCE }%1U  
    // 更新网络状态 IIF <Zkpb  
    - (void)updateStatus { 1 qp"D_h  
        self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; *r7%'K{ C  
    } w@\4ft6d  
0n={Mb  
    // 通知网络状态 %_~1(Glz  
    - (void)reachabilityChanged:(NSNotification *)note { 7f<@+&  
        [self updateStatus]; `(6cRT`Wp  
        if (self.remoteHostStatus == NotReachable) { \6pQ&an  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil) HYZp= *eb  
                         message:NSLocalizedString (@"NotReachable", nil) 4H{$zMq8  
                        delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; zz8N BO  
            [alert show]; !P":z0K4  
            [alert release]; xlh<}V tp  
        }  @l&{ j  
    } }Nma %6PfV  
$+,kibk*R  
    // 程序启动器,启动网络监视 y I[kaH"J  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { iP1yy5T  
     Cm0K-~ U  
        // 设置网络检测的站点 #RKd >ig%  
        [[Reachability sharedReachability] setHostName:@"www.apple.com"]; mcs!A/]<  
        [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; 2(P<TP ._E  
        // 设置网络状态变化时的通知函数 p<y \ ^a  
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) v+( P4f S  
                                                 name:@"kNetworkReachabilityChangedNotification" object:nil]; |D[LU[<C  
        [self updateStatus]; +WguWLO"  
    } p[;@9!t  
S%wd Xe  
    - (void)dealloc { Nk1p)V SC  
        // 删除通知对象 $yUPua/-  
        [[NSNotificationCenter defaultCenter] removeObserver:self]; `3z6y& dmx  
        [window release]; J<&?Hb*|  
        [super dealloc]; -U;=]o1  
    } f>m ! }F:  
      sHOBT,B  
    Reachability 2.0版本 nB}eJ D|  
     7&(h_}Z  
IBW-[lr7  
    // MyAppDelegate.h Zm+GH^f'  
    @class Reachability; +F>e rdV  
AXv-%k};  
        @interface MyAppDelegate : NSObject <UIApplicationDelegate> { }}oIZP\qM  
            Reachability  *hostReach; s%A?B 8,  
        } Kp!A ay  
UlPGB2B  
    @end ~ cI`$kJ  
`X B$t?xi  
    // MyAppDelegate.m [}}q/7Lp  
    - (void)reachabilityChanged:(NSNotification *)note { R_vK^Da  
        Reachability* curReach = [note object]; '>Thn{  
        NSParameterAssert([curReach isKindOfClass: [Reachability class]]); is^5TL%@  
        NetworkStatus status = [curReach currentReachabilityStatus]; Fz5eCe\B  
     iT+t  
        if (status == NotReachable) { CX ; m8  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName"" fVi[mH0=+  
                              message:@"NotReachable" /PG%Y]l0b  
                              delegate:nil a%QgL&_5  
                              cancelButtonTitle:@"YES" otherButtonTitles:nil]; b{ tp qNm~  
                              [alert show]; hI*6f3Vn(n  
                              [alert release]; *T.V5FB0S  
        } |lyspD  
    } )r(e\_n  
                               :*cd$s  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { UgOhx- 8  
        // ... =>O{hT ^F  
                   _*xY>?Aq  
        // 监测网络情况 DW)X3A(^  
        [[NSNotificationCenter defaultCenter] addObserver:self cmY `$=  
                              selector:@selector(reachabilityChanged:) hb>uHUb&  
                              name: kReachabilityChangedNotification 3(:?Z-iKe  
                              object: nil]; 7O i<_b  
        hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; HaRx(p0  
        hostReach startNotifer]; l v BcEg  
        // ... th5UzpB4  
    } XRP+0=0  
m &[(xVM  
Pu'lp O  
二:使用NSConnection下载数据 6H0aHCM  
      :j`XU  
    1.创建NSConnection对象,设置委托对象 h|<;:o?yh  
     =!/T4Oo  
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]]; j V<5GWq  
    [NSURLConnection connectionWithRequest:request delegate:self]; x6vkd%fCj  
     :]LW,Eql  
    2. NSURLConnection delegate委托方法 {#&D=7LP  
        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;   v7D0E[)~  
        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;   Vq^b_^  
        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;   ppeF,Q  
        - (void)connectionDidFinishLoading:(NSURLConnection *)connection;   YI]/gWeu  
.73sY5hdTN  
    3. 实现委托方法 V h5\'Sn  
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { ler$HA%F]  
        // store data }T53y6J#  
        [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存 Hdjp^O!  
    } ~$1g"jIw  
     "po;[ Ia2  
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { f+Fzpd?wS  
           /* appends the new data to the received data */ y-Lm^ GW4  
        [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后 s,M]f,T  
    } e'fo^XQn[  
T ^/\Rr  
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { ;h#Q!M&e#  
        // 错误处理 VuH }@  
    } J@rB rKC  
_9S"rH[  
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection { Q{ { =  
        // disconnect WJ\,Y} J  
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;   {9~3y2:  
        NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; `Y, Rk  
        NSLog(returnString); Tq8U5#NF  
        [self urlLoaded:[self urlString] data:self.receivedData]; "DRiJ.|APs  
        firstTimeDownloaded = YES; ~b[5}_L=>  
    } ifmX<'(9A  
r]S"i$  
三:使用NSXMLParser解析xml文件 ]=Wq&~  
yXf+dMv  
    1. 设置委托对象,开始解析 H< q z rO  
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做: WGUd@lC~  
    // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable >=3oe.$)  
    // because it gives less control over the network, particularly in responding to connection errors. p1IN%*IV+o  
    [parser setDelegate:self]; @J6V ,  
    [parser parse]; a24(9(yh  
<4I`|D3@  
    2. 常用的委托方法 v}@Uc-(  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName FWLLbL5t  
                                namespaceURI:(NSString *)namespaceURI 1([?EfC  
                                qualifiedName:(NSString *)qName OSwum!hzN  
                                attributes:(NSDictionary *)attributeDict; O1oh,~W  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName @2+'s;mUV  
                                namespaceURI:(NSString *)namespaceURI Krr51` hZH  
                                qualifiedName:(NSString *)qName; w(Q{;RNM;  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; )t,efg  
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; "~"=e  
r6nWrO>y  
    static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; -r[O_[g w  
V}h)e3X  
    3.  应用举例 iS`ok  
    - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error ZtpbKy!\$B  
    { j<h0 `v  
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; - P4X@s_;  
        [parser setDelegate:self]; j% '~l#nw  
        [parser setShouldProcessNamespaces:NO]; "_\77cqpTh  
        [parser setShouldReportNamespacePrefixes:NO]; c7R6.T  
        [parser setShouldResolveExternalEntities:NO]; GvL\%0Ibx  
        [parser parse]; /@",5U#  
        NSError *parseError = [parser parserError]; PE6ZzxR|U<  
        if (parseError && error) { TR:4$92:H  
            *error = parseError; =b Q\BY#  
        } ayLINpL  
        [parser release]; [MeFj!(  
    } Z|d+1i  
Z_Y gV:jc  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI Yr>7c1FZi  
                                        qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{ .gCun_td#  
        // 元素开始句柄 {G=|fgz  
        if (qName) { RuOse9  
            elementName = qName; g c W'  
        } )OFf nKh  
        if ([elementName isEqualToString:@"user"]) { = @lM*  
            // 输出属性值 U< "k -  
            NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]); 1:q`KkJx  
        } W'v o?  
    } .nei9Y*  
H)X&5E  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI AzSmfEaU0  
                                        qualifiedName:(NSString *)qName ?p>m ;Aq  
    { 48.4GwL7  
        // 元素终了句柄 u_Xp\RJ  
        if (qName) { t*Z4&Sy^  
               elementName = qName; 0fN; L;v  
        } Q|7m9~  
    } OK \9`  
5#dJg a/88  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string IJLuu@kRm,  
    { +O7GgySx  
        // 取得元素的text a *nCvZ  
    } L!Gpk)}[i  
xQNGlVipZ@  
    NSError *parseError = nil; e8k|%m<Sp  
    [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; yxi*4R  
     WFvVu3  
        
清空我的评分动态本帖最近评分记录: 共2条评分记录
younker 可可豆 +10 2011-07-08 优秀文章
zenny_chen 可可豆 +3 2010-09-23 很不错,呵呵
隐藏评分记录
级别: 精灵王
UID: 22435
精华: 0
发帖: 847
可可豆: 7948 CB
威望: 7895 点
在线时间: 563(时)
注册时间: 2010-06-17
最后登录: 2018-06-07
1 楼:  发表于: 2010-09-03 22:36    发自: Web Page
非常感谢LZ的无私分享!
级别: 新手上路
UID: 29631
精华: 1
发帖: 29
可可豆: 296 CB
威望: 296 点
在线时间: 157(时)
注册时间: 2010-09-03
最后登录: 2016-08-06
2 楼:  发表于: 2010-09-03 22:55    发自: Web Page
使用NSOperation和NSOperationQueue启动多线程
在app store中的很多应用程序非常的笨重,他们有好的界面,但操作性很差,比如说当程序从网上或本地载入数据的时候,界面被冻结了,用户只能等程序完全载入数据之后才能进行操作。 T/jxsIt3  
当打开一个应用程序时,iphone会产生一个包含main方法的线程,所用程序中的界面都是运行在这个线程之中的(table views, tab bars, alerts…),有时候我们会用数据填充这些view,现在问        题是如何有效的载入数据,并且用户还能自如的操作程序。方法是启动新的线程,专门用于数据的下载,而主线程不会因为下载数据被阻塞。 x|g2H.n  
不管使用任何编程语言,在实现多线程时都是一件很麻烦的事情。更糟糕的是,一旦出错,这种错误通常相当糟糕。然而,幸运的是apple从os x10.5在这方面做了很多的改进,NSThread的引入,使得开发多线程应用程序容易多了。除此之外,它们还引入了两个全新的类,NSOperation和NSOperationQueue。 %I@ vMs^  
接下来我们通过一个实例来剖析如何使用这两个类实现多线程。这里指示展示这两个类的基本用法,当然这不是使用他们的唯一办法。 T75N0/teS  
如果你熟悉java或者它的别的变种语言的话 ,你会发现NSOperation对象很像java.lang.Runnable接口,就像java.lang.Runnable接口那样,NSOperation类也被设计为可扩展的,而且只有一个需要重写的方法。它就是-(void)main。使用NSOperation的最简单的方式就是把一个NSOperation对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成。然后它被队列释放。 t"YN:y8-  
下面的例子中,使用一个获取网页,并对其解析程NSXMLDocument,最后将解析得到的NSXMLDocument返回给主线程。 DkW^gt  
     ts r{-4V  
PageLoadOperation.h@interface PageLoadOperation : NSOperation { P[r$KGz  
    NSURL *targetURL;} AsI.8"   
@property(retain) NSURL *targetURL; IaO*{1re  
- (id)initWithURL:(NSURL*)url;@end `tl-] ^Y2  
q XB E3  
PageLoadOperation.m N3w y][bo  
#import "PageLoadOperation.h"#import "AppDelegate.h"@implementation PageLoadOperation@synthesize targetURL;- (id)initWithURL:(NSURL*)url;{ 3=%G{L16-  
    if (![super init]) return nil; mv(/M t  
    [self setTargetURL:url]; ^grDP* ;W  
    return self;}- (void)dealloc { 7yOBxb   
    [targetURL release], targetURL = nil; @[ {5{ y  
    [super dealloc]; Y[W] YPs  
} bl\;*.s'  
- (void)main :0Fc E,1  
{ nIqF:6/  
    NSString *webpageString = [[[NSString alloc] o8S P#ET"n  
    initWithContentsOfURL:[self targetURL]] autorelease]; mB%m<Zo\U  
    NSError *error = nil; 8#HQ05q>  
    NSXMLDocument *document = [[NSXMLDocument alloc] M%s!qC+  
    initWithXMLString:webpageString )M@^Z(W/a  
    options:NSXMLDocumentTidyHTML error:&error]; ^1Bk*?Yx\x  
    if (!document) { 3;R`_#t+  
        NSLog(@"%s Error loading document (%@): %@", n%!50E6*:  
        _cmd, [[self targetURL] absoluteString], error); ,_K:DSiB  
         return; f4 vdJ5pV  
    } qos/pm$&i  
    [[AppDelegate shared] YB(8 T"  
    performSelectorOnMainThread:@selector(pageLoaded:) V@K^9R,|  
         withObject:document waitUntilDone:YES]; ?<^^.Si  
    [document release]; S`vw<u4t  
} W9{y1,G9  
@end .GWN~iR(  
    正如我们所看到的那样,这个类相当的简单,在它的init方法中接受一个url并保存起来,当main函数被调用的时候,它使用这个保存的url创建一个字符串,并将这个字符串传递给NSXMLDocumentinit方法。如果加载的xml数据没有出错,数据会被传递给AppDelegate,它处于主线程中。到此,这个线程的任务就完成了。在主线程中注销操作队列的时候,会将这个NSOperation对象释放。 OK2\2&G  
AppDelegate.h hPUZ{#;n  
@interface AppDelegate : NSObject { ;Hi aX<O!  
    NSOperationQueue *queue; &iT^IkA{  
}+ (id)shared;- (void)pageLoaded:(NSXMLDocument*)document;@endAppDelegate.m        #import "AppDelegate.h"#import "PageLoadOperation.h"@implementation AppDelegate m; PTO$--  
static AppDelegate *shared;  _w FK+>  
static NSArray *urlArray;  ".?y!VY  
- (id)init MPLeqk$;  
{ Bo ??1y  
    if (shared) rw75(Lp{  
    { o%K1!'  
        [self autorelease]; .:tR*Kst`7  
        return shared; 2hTsjJ!'  
    } 1U ='"  
    if (![super init]) return nil;    NSMutableArray *array = [[NSMutableArray alloc] init];[array addObject:@"http://www.google.com"];[array addObject:@"http://www.apple.com"];[array addObject:@"http://www.yahoo.com"];[array addObject:@"http://www.zarrastudios.com"];[array addObject:@"http://www.macosxhints.com"];urlArray = array;    queue = [[NSOperationQueue alloc] init];shared = self;return self; `0-i>>  
    } SRrp = >w?  
    •    (void)applicationDidFinishLaunching: Pt'=_^I o  
    (NSNotification *)aNotification m~F ~9&  
{ }MtORqK  
        for (NSString *urlString in urlArray) !"'@c  
        { A@reIt  
        NSURL *url = p$<){,R  
        [NSURL URLWithString:urlString];        PageLoadOperation *plo = J~ wu*x  
        [[PageLoadOperation alloc] initWithURL:url]; %m$t'?  
        [queue addOperation:plo]; &+GbklUB~  
        [plo release]; !k#N] 9D3  
        } 7>-99o^W  
} Ld=6'C8ud  
- (void)dealloc S4OOm[8  
{ :^]Fp UY  
        [queue release], queue = nil; E&Sr+D aPD  
        [super dealloc]; i'}"5O+  
} xFyBF[c  
+ (id)shared; A$?o3--#]G  
{ i(xL-&{  
        if (!shared) { r$%,k*X^ k  
            [[AppDelegate alloc] init]; S}K-\[i?  
        } Ef=4yH?\j  
        return shared; Gz7,g Y  
} 7 *4i0{]  
- (void)pageLoaded:(NSXMLDocument*)document; h{ e Q\iI  
{ ][~rk?YY  
        NSLog(@"%s Do something with the XMLDocument: %@", <g, 21(bc  
             _cmd, document); GD!!xt  
} 8_3WCbe/  
@end .L ^F4  
SA [(1dy;  
NSOperationQueue的并行控制(NSOperationQueue Concurrency) M* dou_Q  
        在上面这个简单的例子中,我们很难看出这些操作是并行运行的,然而,如果你你的操作花费的时间远远比这里的要长,你将会发现,队列是同时执行这些操作的。幸运的是,如果你想要为队列限制同时只能运行几个操作,你可以使用NSOperationQueue的setMaxConcurrentOperationCount:方法。例如,[queue setMaxConcurrentOperationCount:2];
级别: 精灵王
UID: 17862
精华: 0
发帖: 553
可可豆: 5526 CB
威望: 5521 点
在线时间: 1136(时)
注册时间: 2010-04-19
最后登录: 2018-12-13
3 楼:  发表于: 2010-09-08 15:48    发自: Web Page
相当的清晰明了  先顶了  在学习
大年表示毫无压力~
级别: 侠客
UID: 13064
精华: 0
发帖: 82
可可豆: 820 CB
威望: 820 点
在线时间: 469(时)
注册时间: 2010-01-17
最后登录: 2014-03-13
4 楼:  发表于: 2010-09-17 11:57    发自: Web Page
留名  目标10个字
级别: 圣骑士
UID: 14031
精华: 0
发帖: 380
可可豆: 3669 CB
威望: 3669 点
在线时间: 1680(时)
注册时间: 2010-02-10
最后登录: 2016-08-06
5 楼:  发表于: 2010-09-17 12:36    发自: Web Page
必看贴
级别: 侠客
UID: 30926
精华: 1
发帖: 48
可可豆: 510 CB
威望: 510 点
在线时间: 47(时)
注册时间: 2010-09-16
最后登录: 2011-07-10
6 楼:  发表于: 2010-09-17 13:11    发自: Web Page
颇有参考价值,多谢楼主,收了
级别: 侠客
状态: 连续签到 - [1天]
UID: 26254
精华: 0
发帖: 97
可可豆: 924 CB
威望: 920 点
在线时间: 349(时)
注册时间: 2010-07-30
最后登录: 2019-03-06
7 楼:  发表于: 2010-09-17 14:53    发自: Web Page
mark
http://simg.cocoachina.com/201110130152451431.jpg
级别: 圣骑士
UID: 9506
精华: 0
发帖: 434
可可豆: 4110 CB
威望: 4110 点
在线时间: 2434(时)
注册时间: 2009-10-05
最后登录: 2016-08-01
8 楼:  发表于: 2010-09-17 17:53    发自: Web Page
是不是差一个wiki系统,方便把自己的心得整理出来。
级别: 侠客
状态: 连续签到 - [3天]
UID: 23185
精华: 0
发帖: 140
可可豆: 1317 CB
威望: 1311 点
在线时间: 744(时)
注册时间: 2010-06-26
最后登录: 2015-05-14
9 楼:  发表于: 2010-09-17 19:26    发自: Web Page
mark 重点学习了

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部