注册 登录
主题 : 网络编程总结
级别: 新手上路
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 GEF's#YWK  
S.~L[iLc  
    1. 添加源文件和framework xb3G,F  
     #e-K It  
    开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。 N6"sXw m  
    Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部: uX3yq<lK"  
     @jm+TW  
    1.1. 添加源文件: M,@M5o2u  
    在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图: v:QUwW  
T`":Q1n  
     ][jwy-Uy;  
     ))f@9m  
    1.2.添加framework: w01[oU$x=  
    将SystemConfiguration.framework 添加进工程。如下图: &)tiO>B^6  
     j \jMN*dmV  
     5z,q~CU  
    2. 网络状态 4@3\Ihv  
     oo\^}jb  
    Reachability.h中定义了三种网络状态: G\dPGPPM  
    typedef enum { :_6o|9J\t  
        NotReachable = 0,            //无连接 cB){b'WJ  
        ReachableViaWiFi,            //使用3G/GPRS网络 :?\29j#*V  
        ReachableViaWWAN            //使用WiFi网络 Lv['/!DJ|  
    } NetworkStatus; # o/;du  
     :rQDA =Ps  
    因此可以这样检查网络状态: Ie/_gz^  
q"<=^vi  
    Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”]; 7*+CX  
    switch ([r currentReachabilityStatus]) { /y{: N  
            case NotReachable: {l,&F+W$C  
                    // 没有网络连接 \ tYImh  
                    break; SNOc1c<~  
            case ReachableViaWWAN: slPr^)  
                    // 使用3G网络 <q!HY~"V  
                    break;  ~d eS*  
            case ReachableViaWiFi: '1LN)Yw  
                    // 使用WiFi网络 )/@KdEA:  
                    break; 4"kc(J`c  
    } bWp:!w#K  
     J FnE{  
    3.检查当前网络环境 ocWl]h].  
    程序启动时,如果想检测可用的网络环境,可以像这样 DdI%TU K,  
    // 是否wifi 9)v]j k  
    + (BOOL) IsEnableWIFI { (0q`eO2  
        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable); y EfAa6  
    } 9e K~g0m  
:XFQ}Cl  
    // 是否3G :JG5)H}j+  
    + (BOOL) IsEnable3G { _Sfu8k>):  
        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable); S/)),~`4  
    } e8("G[P >  
    例子: jyW={%&  
    - (void)viewWillAppear:(BOOL)animated {     \Hrcf+`  
    if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && l+F29_o#  
            ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) { 8xAIn>,_  
            self.navigationItem.hidesBackButton = YES; _ikKOU^8  
            [self.navigationItem setLeftBarButtonItem:nil animated:NO]; /B?wn=][  
        } !7 I07~&1  
    } J{dO0!7y  
Z40k>t D  
    4. 链接状态的实时通知 k1xx>=md|C  
    网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户: 36(qe"s  
     aUZ?Ue9l>2  
    Reachability 1.5版本 #;a+)~3*O  
    // My.AppDelegate.h KPO w  
    #import "Reachability.h" #Mn?Nn  
'yX\y 6I  
    @interface MyAppDelegate : NSObject <UIApplicationDelegate> { N.q~\sF^  
        NetworkStatus remoteHostStatus; |Jd8ul:&e  
    } DCiU?u~  
/!5ohQlPJ  
    @property NetworkStatus remoteHostStatus; b'+Wf#.]f0  
`)y ;7%-  
    @end =t-Ud^3  
?%~p@  
    // My.AppDelegate.m bT2c&VPCE  
    #import "MyAppDelegate.h" 51|s 2+GG  
W vB]Rs  
    @implementation MyAppDelegate gPB=Z!  
    @synthesize remoteHostStatus; 6AJ`)8HX  
\-]Jm[]^  
    // 更新网络状态 F]6G<6T[  
    - (void)updateStatus { 1$03:ve1  
        self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; j1g$LAe  
    } Y QC.jnb2  
"r@#3T$  
    // 通知网络状态 eK1l~W%  
    - (void)reachabilityChanged:(NSNotification *)note { mvT /sC7I  
        [self updateStatus]; 4N$Wpx  
        if (self.remoteHostStatus == NotReachable) { /} Pd O  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil) 5A`>3w{3n  
                         message:NSLocalizedString (@"NotReachable", nil) 5 l8F.LtO\  
                        delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; drjNK!XL@  
            [alert show]; 4z5qXI/<m4  
            [alert release]; YT!iI   
        } W?zj^y[w  
    } 98R/ ^\  
<tbs,lcw;  
    // 程序启动器,启动网络监视 6/L[`n"G  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { YX,;z/Jw2  
     VdM Ksx`r  
        // 设置网络检测的站点 ,^c-}`!K  
        [[Reachability sharedReachability] setHostName:@"www.apple.com"]; jm<^WQ%Cc  
        [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; )?SFIQ=  
        // 设置网络状态变化时的通知函数 xI?'Nh  
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) liPrxuP`  
                                                 name:@"kNetworkReachabilityChangedNotification" object:nil]; [DjlkA/Zg  
        [self updateStatus]; R P~ 67L  
    } N7"cMAs\G  
v1yB   
    - (void)dealloc { >g!$H}\  
        // 删除通知对象 yO7H!}y_  
        [[NSNotificationCenter defaultCenter] removeObserver:self]; t=Rl`1 =(K  
        [window release]; S;Sy.Lp  
        [super dealloc]; Xk%eU>d  
    } +1c r6a  
     Cj~e` VRhk  
    Reachability 2.0版本 %1k"K~eu  
     n Yx[9HN  
i`l;k~rP  
    // MyAppDelegate.h ]SA/KV   
    @class Reachability; 4uO88[=  
:* |WE29U  
        @interface MyAppDelegate : NSObject <UIApplicationDelegate> { kK}?NKqT  
            Reachability  *hostReach; X kqsL0\  
        } ,x&WE@tD |  
SHPDbBS  
    @end igTs[q=Ak  
],!}&#|  
    // MyAppDelegate.m l^bak] 9 1  
    - (void)reachabilityChanged:(NSNotification *)note { WP\kg\o  
        Reachability* curReach = [note object]; tE-bHu370  
        NSParameterAssert([curReach isKindOfClass: [Reachability class]]); <ndY6n3  
        NetworkStatus status = [curReach currentReachabilityStatus];  -V2`[k  
     >V )#y$Z  
        if (status == NotReachable) { 2<J2#}+ \  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName"" .R` _"7  
                              message:@"NotReachable" W7|nc,i0\  
                              delegate:nil 8~,z v_Pl  
                              cancelButtonTitle:@"YES" otherButtonTitles:nil]; X{cB%t o  
                              [alert show]; \PN*gDmX  
                              [alert release]; }KUK|p5  
        } Adiw@q1&  
    } sSKD"  
                               [g"nu0sOK  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { fI;nVRf p  
        // ... \bF<f02P  
                   ]]r ;}$  
        // 监测网络情况 X=?9-z] QO  
        [[NSNotificationCenter defaultCenter] addObserver:self `dX0F=Ag?  
                              selector:@selector(reachabilityChanged:) ]Gm4gd`  
                              name: kReachabilityChangedNotification ux^rF  
                              object: nil]; ~5|R`%  
        hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; jt6_1^  
        hostReach startNotifer]; mvpcRe <  
        // ... KI\bV0$p<  
    } #lMIs4i.  
ImB5F'HI$  
ZGh6- /  
二:使用NSConnection下载数据 mnZfk  
     ZZkc) @  
    1.创建NSConnection对象,设置委托对象 :##$-K*W"  
     wG s'qL"z  
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]]; 7R5ebMW V  
    [NSURLConnection connectionWithRequest:request delegate:self]; e@O]c "  
     e9'0CH<  
    2. NSURLConnection delegate委托方法 /z!y[ri+J  
        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;   `j'1V1  
        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;   X*7VDt=  
        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;   9Ut eD@*  
        - (void)connectionDidFinishLoading:(NSURLConnection *)connection;   tIV9Y=ckr0  
n| H8O3@  
    3. 实现委托方法 N?rE:0SJ  
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { L^C B#5uG  
        // store data FU*q9s`  
        [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存 //r)dN^  
    } @||nd,i`n~  
     W +GBSl  
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { _ j'm2BA O  
           /* appends the new data to the received data */ D5Rp<PBq,  
        [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后 $rQ7"w J  
    } cna%;f.  
H0B=X l[  
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { G,WLca[  
        // 错误处理 p {. 6  
    } &%( Dd  
"-:g.x*d  
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection { s4f{ziLp  
        // disconnect H^o_B1  
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;   (8ct'Q;  
        NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; t}}Ti$$>  
        NSLog(returnString); @[\zO'|  
        [self urlLoaded:[self urlString] data:self.receivedData]; W"\`UzOLQ  
        firstTimeDownloaded = YES; @v&P;=lU  
    } 1\lZ&KX$i  
}3WP:Et  
三:使用NSXMLParser解析xml文件 ep5`&g]3  
op-\|<i  
    1. 设置委托对象,开始解析  Uv<nJM  
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做: eFy {VpO+  
    // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable W4P\HM>2  
    // because it gives less control over the network, particularly in responding to connection errors. S~m8j |3K  
    [parser setDelegate:self]; *e:I*L  
    [parser parse]; _I,GH{lhI  
GHi'ek<?^  
    2. 常用的委托方法 NyC&j`d  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName Ke#Rkt  
                                namespaceURI:(NSString *)namespaceURI yoieWnL}  
                                qualifiedName:(NSString *)qName M;AvOk|&  
                                attributes:(NSDictionary *)attributeDict; !w/fw Oo  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName XLYGhM  
                                namespaceURI:(NSString *)namespaceURI EcytNYn  
                                qualifiedName:(NSString *)qName; M 'X,7hZ  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; 3TV4|&W;  
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; inq {" 6  
!H)!b#_  
    static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; 'O2/PU2_  
]d{lS&PRlg  
    3.  应用举例 S&l [z,  
    - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error gCRPaF6  
    { D^s#pOZS  
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; *(wxNsK  
        [parser setDelegate:self]; ;ioF'ov  
        [parser setShouldProcessNamespaces:NO]; C*RPSk  
        [parser setShouldReportNamespacePrefixes:NO]; 7#Fcn  
        [parser setShouldResolveExternalEntities:NO]; &N/dxKZcc  
        [parser parse]; +_*iF5\  
        NSError *parseError = [parser parserError]; c1R[Hck  
        if (parseError && error) { %ib7)8Ki0  
            *error = parseError; c*R\fQd  
        } 5TeGdfu @  
        [parser release]; #Rs5W  
    } spQr1hx<  
]TtID4qL  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI nHF~a?|FT  
                                        qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{ 5~[][VV^  
        // 元素开始句柄 t1yfSStp  
        if (qName) { B=r+ m;(  
            elementName = qName; i&)([C0z$  
        } T^$`Z.  
        if ([elementName isEqualToString:@"user"]) { @0tX ,Z 9  
            // 输出属性值 z.h;}QRJ,@  
            NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]); $Dv5TUKw  
        } _ q>|pt.W  
    } Y>8 JHoV  
c;a<nTLn  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI Ck m:;q  
                                        qualifiedName:(NSString *)qName &VCg`r-{~  
    { Ne3YhCC>  
        // 元素终了句柄 |,H 2ge  
        if (qName) { M,oZ_tY%  
               elementName = qName; oRg ,oy  
        } V`c,U7[/  
    } d|W=_7 z  
/#t::b+>x  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string Uhn3usK  
    { M U '-  
        // 取得元素的text Jko=E   
    } &(p5z4Df  
P_p\OK*l]o  
    NSError *parseError = nil; tU!Yg"4Q  
    [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; '<e$ c  
     rAqS;@]0  
        
清空我的评分动态本帖最近评分记录: 共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中的很多应用程序非常的笨重,他们有好的界面,但操作性很差,比如说当程序从网上或本地载入数据的时候,界面被冻结了,用户只能等程序完全载入数据之后才能进行操作。 .>1Y-NM  
当打开一个应用程序时,iphone会产生一个包含main方法的线程,所用程序中的界面都是运行在这个线程之中的(table views, tab bars, alerts…),有时候我们会用数据填充这些view,现在问        题是如何有效的载入数据,并且用户还能自如的操作程序。方法是启动新的线程,专门用于数据的下载,而主线程不会因为下载数据被阻塞。 T~g`;Q%i  
不管使用任何编程语言,在实现多线程时都是一件很麻烦的事情。更糟糕的是,一旦出错,这种错误通常相当糟糕。然而,幸运的是apple从os x10.5在这方面做了很多的改进,NSThread的引入,使得开发多线程应用程序容易多了。除此之外,它们还引入了两个全新的类,NSOperation和NSOperationQueue。 X7tBpyi  
接下来我们通过一个实例来剖析如何使用这两个类实现多线程。这里指示展示这两个类的基本用法,当然这不是使用他们的唯一办法。 1vJj?Uqc  
如果你熟悉java或者它的别的变种语言的话 ,你会发现NSOperation对象很像java.lang.Runnable接口,就像java.lang.Runnable接口那样,NSOperation类也被设计为可扩展的,而且只有一个需要重写的方法。它就是-(void)main。使用NSOperation的最简单的方式就是把一个NSOperation对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成。然后它被队列释放。 Q=#FvsF#z3  
下面的例子中,使用一个获取网页,并对其解析程NSXMLDocument,最后将解析得到的NSXMLDocument返回给主线程。 PZ?kv4  
     >>8{N)c5E  
PageLoadOperation.h@interface PageLoadOperation : NSOperation { kcMg`pJ4<  
    NSURL *targetURL;} 4 DV,f2:R4  
@property(retain) NSURL *targetURL; @V^5_K  
- (id)initWithURL:(NSURL*)url;@end y!q`o$nK  
aH_FBY  
PageLoadOperation.m 4|4[3Ye7u:  
#import "PageLoadOperation.h"#import "AppDelegate.h"@implementation PageLoadOperation@synthesize targetURL;- (id)initWithURL:(NSURL*)url;{ .4<lw  
    if (![super init]) return nil; <B @z>V  
    [self setTargetURL:url]; "/3YV%to-#  
    return self;}- (void)dealloc { ph%t #R  
    [targetURL release], targetURL = nil; t=jG$A  
    [super dealloc]; z 8#{=e  
} HLc3KYIk  
- (void)main nmyDGuzk  
{ u?'J1\z  
    NSString *webpageString = [[[NSString alloc] 38:5g_  
    initWithContentsOfURL:[self targetURL]] autorelease]; j}fSz)`i  
    NSError *error = nil; vRDs~'f  
    NSXMLDocument *document = [[NSXMLDocument alloc] F9A 5}/\  
    initWithXMLString:webpageString BhiOV_}Hn  
    options:NSXMLDocumentTidyHTML error:&error]; l?Ls=J*  
    if (!document) { m5, &;~  
        NSLog(@"%s Error loading document (%@): %@", J?hs\nA  
        _cmd, [[self targetURL] absoluteString], error); ^ _W] @m2  
         return; TS=U%)Ik  
    } J90 )v7  
    [[AppDelegate shared] ]AN%#1++U  
    performSelectorOnMainThread:@selector(pageLoaded:) o/=61K8D  
         withObject:document waitUntilDone:YES]; sNMF(TY  
    [document release]; <@0S]jy  
} E #!.;AQ  
@end "x 3C3Zu.;  
    正如我们所看到的那样,这个类相当的简单,在它的init方法中接受一个url并保存起来,当main函数被调用的时候,它使用这个保存的url创建一个字符串,并将这个字符串传递给NSXMLDocumentinit方法。如果加载的xml数据没有出错,数据会被传递给AppDelegate,它处于主线程中。到此,这个线程的任务就完成了。在主线程中注销操作队列的时候,会将这个NSOperation对象释放。 \vS > jB  
AppDelegate.h h&~9?B  
@interface AppDelegate : NSObject { 10N0?K"  
    NSOperationQueue *queue; ob|^lAU  
}+ (id)shared;- (void)pageLoaded:(NSXMLDocument*)document;@endAppDelegate.m        #import "AppDelegate.h"#import "PageLoadOperation.h"@implementation AppDelegate `-?`H>+OG  
static AppDelegate *shared; 8CH9&N5W5t  
static NSArray *urlArray; [Ov/&jD"  
- (id)init Ua~8DdW  
{ I\IDt~  
    if (shared) F iXqypT_(  
    { g?cxqC<  
        [self autorelease]; D/,(xWaT  
        return shared; DwWm(8&6;}  
    } sG^{ cn  
    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; K;>9K'n  
    } :X}Ie P  
    •    (void)applicationDidFinishLaunching: pkTVQdtRG  
    (NSNotification *)aNotification DV)NY!  
{ {j4&'=C:  
        for (NSString *urlString in urlArray) Q~KzcB<  
        { !:}m-iqQ1  
        NSURL *url = 7c6- o"A  
        [NSURL URLWithString:urlString];        PageLoadOperation *plo = g(G$*#}o8A  
        [[PageLoadOperation alloc] initWithURL:url]; wT- K g=-q  
        [queue addOperation:plo]; _'n]rQ'  
        [plo release]; E*s _Y  
        } Rh)%;  
} =T)y(] ;M$  
- (void)dealloc T#vY(d  
{ ]]y,FQ,r  
        [queue release], queue = nil; KJs`[,;<  
        [super dealloc]; $ P2*qpqy  
} ZQ' |B  
+ (id)shared; S9'Xsh  
{  w U1[/  
        if (!shared) { 2~ vvE  
            [[AppDelegate alloc] init]; b+L!p.:  
        } NW&2ca  
        return shared; a^Q ?K\c4N  
} {]dvzoE ]  
- (void)pageLoaded:(NSXMLDocument*)document; b tbuE  
{  sN) xNz  
        NSLog(@"%s Do something with the XMLDocument: %@", |C0!mU  
             _cmd, document); :Smyk.B2!  
} U_Q;WPJ  
@end k"m+i   
'+c@U~d*7  
NSOperationQueue的并行控制(NSOperationQueue Concurrency) vZ^U]h V  
        在上面这个简单的例子中,我们很难看出这些操作是并行运行的,然而,如果你你的操作花费的时间远远比这里的要长,你将会发现,队列是同时执行这些操作的。幸运的是,如果你想要为队列限制同时只能运行几个操作,你可以使用NSOperationQueue的setMaxConcurrentOperationCount:方法。例如,[queue setMaxConcurrentOperationCount:2];
级别: 精灵王
UID: 17862
精华: 0
发帖: 553
可可豆: 5526 CB
威望: 5521 点
在线时间: 1134(时)
注册时间: 2010-04-19
最后登录: 2017-06-15
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
最后登录: 2018-09-19
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 重点学习了

本站内容均为本站转发,已尽可能注明出处。因未能核实来源或转发内容图片有权利瑕疵的,请及时联系本站,本站会第一时间进行修改或删除。 QQ : 3442093904

描述
快速回复

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

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

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