注册 登录
主题 : 网络编程总结
级别: 新手上路
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 vn;_|NeSf  
oQJK}9QR  
    1. 添加源文件和framework (Bs0 /C  
     J;+A G^U<  
    开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。 gE8=#%1<  
    Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部: W-mi1l^H{  
     `5}XmSJ?5  
    1.1. 添加源文件: a&YD4DQ05  
    在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图: YpQ/ )fSEV  
$q#|B3N%  
     zo66=vE!  
     2!QS&i  
    1.2.添加framework: w-Zb($_  
    将SystemConfiguration.framework 添加进工程。如下图: l'YpSO~l7  
     7aTo! T  
     3\eb:-B:@  
    2. 网络状态 ;6aTt2BQ  
     ?8wFT!J  
    Reachability.h中定义了三种网络状态: V^Wo%e7#u[  
    typedef enum { `o(PcX3/}  
        NotReachable = 0,            //无连接 9TGjcZ1S'  
        ReachableViaWiFi,            //使用3G/GPRS网络 ;w1?EdaO  
        ReachableViaWWAN            //使用WiFi网络 K~$o2a e  
    } NetworkStatus; IQ$l!)  
     ,6rg00wGE  
    因此可以这样检查网络状态: 9ls<Y  
.E:QZH'M  
    Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”]; [sG=(~BU  
    switch ([r currentReachabilityStatus]) { .Ajs0 T2  
            case NotReachable: )mO|1IDTN  
                    // 没有网络连接 b6!?K!imT  
                    break; *LJN2;  
            case ReachableViaWWAN: k>#,1GbNZy  
                    // 使用3G网络 kQlXcR  
                    break;  @ -pi  
            case ReachableViaWiFi: -05zcIVo  
                    // 使用WiFi网络 O?X g%k#  
                    break; <rc3&qmd  
    } N>;"r]Rl"  
     qe!`LeT#  
    3.检查当前网络环境 vG WX=O  
    程序启动时,如果想检测可用的网络环境,可以像这样 _$/(l4\T[  
    // 是否wifi 8EZ"z d`n/  
    + (BOOL) IsEnableWIFI { W&`_cGoP  
        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable); yBO88rfh>  
    } MNip;S_j  
xy`aR< L  
    // 是否3G mj :8ZZ  
    + (BOOL) IsEnable3G { b\~rL,7(  
        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable); _[h1SAJ  
    } #tG /{R  
    例子: jTk !wm=  
    - (void)viewWillAppear:(BOOL)animated {     vW6Pf^yJ  
    if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && 3$+|nP:U  
            ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) { ^!H8"CdC3  
            self.navigationItem.hidesBackButton = YES; "PGEiLY  
            [self.navigationItem setLeftBarButtonItem:nil animated:NO]; R:YX{Tq  
        } &,Dh*)k  
    } o2?[*pa  
]t_AXKd  
    4. 链接状态的实时通知 u#XNl":x  
    网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户: 6TS+z7S81L  
     c>d+q9M  
    Reachability 1.5版本 hBDPz1<  
    // My.AppDelegate.h reLYtv  
    #import "Reachability.h" s9) @$3\  
5o\yhYS:  
    @interface MyAppDelegate : NSObject <UIApplicationDelegate> { 1vQf=t %lw  
        NetworkStatus remoteHostStatus; 8^j u=  
    } 1fwCQM   
M=n!tVlCV  
    @property NetworkStatus remoteHostStatus; :av6*&+  
X tZ0z?  
    @end VR5$[-E3  
Md'd=Y_0  
    // My.AppDelegate.m `/ix[:}m^  
    #import "MyAppDelegate.h" hfP}+on%  
[r_,BH\nu  
    @implementation MyAppDelegate dUeM+(s1  
    @synthesize remoteHostStatus; zllY $V&<!  
,eD@)K_:  
    // 更新网络状态 lwPK^)|}  
    - (void)updateStatus { 7(na?Z$  
        self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; 2-nL2f!a{p  
    } %YefTk8cr,  
fKIwdk%!-  
    // 通知网络状态 {c|nIwdB  
    - (void)reachabilityChanged:(NSNotification *)note { KZeRbq2 jJ  
        [self updateStatus]; '#[U7(lIQ  
        if (self.remoteHostStatus == NotReachable) { 4%2QF F @  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil) $6atr-Pb  
                         message:NSLocalizedString (@"NotReachable", nil) hu[=9#''$  
                        delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; x-) D@dw<  
            [alert show]; wG2lCv`d  
            [alert release]; a?E]-Zf  
        } Y>Q9?>}Q  
    } mIq6\c$  
%).phn"ij[  
    // 程序启动器,启动网络监视 2?rg&og6  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { *\m 53mb  
     |{cdXbr  
        // 设置网络检测的站点 g;w4:k)U  
        [[Reachability sharedReachability] setHostName:@"www.apple.com"]; GEfX,9LF&  
        [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; F6Zl#eL  
        // 设置网络状态变化时的通知函数 orf21N+[  
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) i>r4R z!  
                                                 name:@"kNetworkReachabilityChangedNotification" object:nil]; XLp tJ4~v  
        [self updateStatus]; MzYTEe&-L  
    } LlL\7?_;  
K,%H*1 YKK  
    - (void)dealloc { <=n$o MO  
        // 删除通知对象 !TP8LQ  
        [[NSNotificationCenter defaultCenter] removeObserver:self]; bG67TWY)  
        [window release]; >[,Rt"[V  
        [super dealloc]; wcP0PfY  
    } +pc_KR  
     UZMo(rG.]{  
    Reachability 2.0版本 zTrAk5E  
     pm B}a7  
//`heFuc]>  
    // MyAppDelegate.h 0}hN/2}&  
    @class Reachability; J7t5 B}}  
R+8+L|\wHv  
        @interface MyAppDelegate : NSObject <UIApplicationDelegate> { E*>tFw&[  
            Reachability  *hostReach; D<5)i)J"  
        } |gx{un`  
bP&o] ?dN  
    @end fGb(=l  
U2/H,D  
    // MyAppDelegate.m :1eI"])(  
    - (void)reachabilityChanged:(NSNotification *)note { qfvd ( w  
        Reachability* curReach = [note object]; Q bfm*JP~  
        NSParameterAssert([curReach isKindOfClass: [Reachability class]]); )y'`C@ijI  
        NetworkStatus status = [curReach currentReachabilityStatus]; (qlI QC  
     oP5G*AFUq  
        if (status == NotReachable) { 6 +^V  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName"" IB /.i(  
                              message:@"NotReachable" 9c8zH{T_{  
                              delegate:nil 8,=Ti7_  
                              cancelButtonTitle:@"YES" otherButtonTitles:nil]; Pk[f_%0  
                              [alert show]; e"hm|'  
                              [alert release]; %~J90a  
        } k!t5>kPSQ  
    } NWNH)O@  
                               ;SeDxyKG  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { wKe^5|Rr  
        // ... xT{qeHeZ9,  
                   D4G*K*z,w4  
        // 监测网络情况 W"AWhi{h  
        [[NSNotificationCenter defaultCenter] addObserver:self << LmO-92  
                              selector:@selector(reachabilityChanged:) a+szA};  
                              name: kReachabilityChangedNotification > FFZ8=  
                              object: nil]; lYv :  
        hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; r ^_8y8&l  
        hostReach startNotifer]; Hs~M!eK  
        // ... .\X/o!xC  
    } ,ZV<o!\  
NwD*EuPF:  
F*>:~'%  
二:使用NSConnection下载数据 [wRk )kl`  
     y.JAtsxD  
    1.创建NSConnection对象,设置委托对象 gl :vJD  
     < Up n~tH  
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]]; HnU M:-6  
    [NSURLConnection connectionWithRequest:request delegate:self]; U}MU>kzb  
     rI o`n2  
    2. NSURLConnection delegate委托方法 ?,]%V1(@V`  
        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;   pZ+zm6\$  
        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;   f'TjR#w  
        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;   >pO[ S [  
        - (void)connectionDidFinishLoading:(NSURLConnection *)connection;   mLPQ5`_  
5&v' aiWK  
    3. 实现委托方法 I/jMe'Kp  
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { ,!F'h:   
        // store data djqSW9  
        [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存 X}0 NeG^'O  
    } $@Zb]gavt?  
     9 }|Bs=q  
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { KCq qwGM  
           /* appends the new data to the received data */ ~^$O NmI5  
        [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后 5|NM]8^^0[  
    } MA.1t  
xO9,,w47  
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 1Ls@|   
        // 错误处理 JxiLjvIq  
    } B{H;3{ 0  
M3K+;-n^  
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection { Q/\ <rG4  
        // disconnect . Uv7{(  
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;   qc|;qPj   
        NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; \r^=W=  
        NSLog(returnString); [ hm/B`t*e  
        [self urlLoaded:[self urlString] data:self.receivedData]; ;"!dq)  
        firstTimeDownloaded = YES; G~a;q+7v'$  
    } I?J$";A  
?{\8!_Gvsl  
三:使用NSXMLParser解析xml文件 ml.l( 6A  
*W y0hnr;]  
    1. 设置委托对象,开始解析 ;H_yNrwA  
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做: ruS/Yh  
    // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable I|m fr{  
    // because it gives less control over the network, particularly in responding to connection errors. ~e{AgY)  
    [parser setDelegate:self]; M ioS  
    [parser parse]; Y~dRvt0_w  
 {3yzC  
    2. 常用的委托方法 knh^q;q*  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName mV@.JFXKP  
                                namespaceURI:(NSString *)namespaceURI 60[f- 0X  
                                qualifiedName:(NSString *)qName 8xDS eXh;  
                                attributes:(NSDictionary *)attributeDict; 2U2=ja9:Y  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName FlOKTY   
                                namespaceURI:(NSString *)namespaceURI J [2;&-@  
                                qualifiedName:(NSString *)qName; vlw2dY@^  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; ;T/W7=4CZ  
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; [X#bDO<t  
7n,nODbJ  
    static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; Ag }hyIl  
U&C\5N]  
    3.  应用举例 ~ bL(mq  
    - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error gdSv) (  
    { GuQ3$B3j  
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; '1~mnmiP  
        [parser setDelegate:self]; rVzj LkN^  
        [parser setShouldProcessNamespaces:NO]; bd_U%0)pi1  
        [parser setShouldReportNamespacePrefixes:NO]; `O.*qs 5  
        [parser setShouldResolveExternalEntities:NO]; 9Vxsv*OR,  
        [parser parse]; ]d_Id]Qa+  
        NSError *parseError = [parser parserError]; QKCc5  
        if (parseError && error) { j +@1frp  
            *error = parseError; m0paGG  
        } !\JG]2 \  
        [parser release]; L q'*B9  
    } ?#ndMv!$  
fxI>FhU_  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 93kSBF#  
                                        qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{ h\Op|#gIT  
        // 元素开始句柄 R)WvU4+U  
        if (qName) { +I/7eIG?|  
            elementName = qName; <po.:c Ce  
        } 7F4$k4r<  
        if ([elementName isEqualToString:@"user"]) { SgAY/#  
            // 输出属性值 7 '2E-#^  
            NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]); ([_ls8  
        } Z?oFee!4  
    } ?q7V B  
}KCXo/y  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI _T 6WA&;8  
                                        qualifiedName:(NSString *)qName W~.1f1)  
    { McNj TD  
        // 元素终了句柄 6NZ3(   
        if (qName) { /_xwHiA  
               elementName = qName; ZWG$MFEjl  
        } 8~ .r/!wfy  
    } VHM,W]  
JiDX|Q<c  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 0+P_z(93?  
    { Z=z'j8z3  
        // 取得元素的text  L/%3_,  
    } #PVgx9T=_  
AQ32rJT8c`  
    NSError *parseError = nil; :o*{ .  
    [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; REW *6:  
     !R//"{k0?  
        
清空我的评分动态本帖最近评分记录: 共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中的很多应用程序非常的笨重,他们有好的界面,但操作性很差,比如说当程序从网上或本地载入数据的时候,界面被冻结了,用户只能等程序完全载入数据之后才能进行操作。  yZmQBh$  
当打开一个应用程序时,iphone会产生一个包含main方法的线程,所用程序中的界面都是运行在这个线程之中的(table views, tab bars, alerts…),有时候我们会用数据填充这些view,现在问        题是如何有效的载入数据,并且用户还能自如的操作程序。方法是启动新的线程,专门用于数据的下载,而主线程不会因为下载数据被阻塞。 CWCE}WU>4  
不管使用任何编程语言,在实现多线程时都是一件很麻烦的事情。更糟糕的是,一旦出错,这种错误通常相当糟糕。然而,幸运的是apple从os x10.5在这方面做了很多的改进,NSThread的引入,使得开发多线程应用程序容易多了。除此之外,它们还引入了两个全新的类,NSOperation和NSOperationQueue。 hkHMBsNi  
接下来我们通过一个实例来剖析如何使用这两个类实现多线程。这里指示展示这两个类的基本用法,当然这不是使用他们的唯一办法。 e#FaK^V  
如果你熟悉java或者它的别的变种语言的话 ,你会发现NSOperation对象很像java.lang.Runnable接口,就像java.lang.Runnable接口那样,NSOperation类也被设计为可扩展的,而且只有一个需要重写的方法。它就是-(void)main。使用NSOperation的最简单的方式就是把一个NSOperation对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成。然后它被队列释放。 =]-!  
下面的例子中,使用一个获取网页,并对其解析程NSXMLDocument,最后将解析得到的NSXMLDocument返回给主线程。 W`6nMFg  
     ;#` Z(A}  
PageLoadOperation.h@interface PageLoadOperation : NSOperation { cg1<  
    NSURL *targetURL;} g 4Vt"2 |  
@property(retain) NSURL *targetURL; jY87N Hg  
- (id)initWithURL:(NSURL*)url;@end P0' ;65  
A){kitx-i)  
PageLoadOperation.m q Z`@Ro  
#import "PageLoadOperation.h"#import "AppDelegate.h"@implementation PageLoadOperation@synthesize targetURL;- (id)initWithURL:(NSURL*)url;{ 1tQZyHc42;  
    if (![super init]) return nil; k5g\s9n]  
    [self setTargetURL:url]; I4qzdD  
    return self;}- (void)dealloc { ?#pL\1"E  
    [targetURL release], targetURL = nil; 'e;*V$+  
    [super dealloc]; $'?CY)h{  
} | 2p\M?@  
- (void)main [gIStKe  
{ 3"I 1'+  
    NSString *webpageString = [[[NSString alloc] mQ VduG  
    initWithContentsOfURL:[self targetURL]] autorelease];  ?o9l{4~g  
    NSError *error = nil; 3~s0ux[  
    NSXMLDocument *document = [[NSXMLDocument alloc] cl:*Q{(Cjk  
    initWithXMLString:webpageString ik7#Og~ 3  
    options:NSXMLDocumentTidyHTML error:&error]; () b0Sh=  
    if (!document) { ;)"r^M)):  
        NSLog(@"%s Error loading document (%@): %@", I>L l c Y  
        _cmd, [[self targetURL] absoluteString], error); 2[j|:Ng7  
         return; tQo"$ JN}  
    } F_YZV)q!W  
    [[AppDelegate shared] {:S{a+ 9~  
    performSelectorOnMainThread:@selector(pageLoaded:) g>OGh o  
         withObject:document waitUntilDone:YES]; -_>c P  
    [document release]; Yk?ux Z4)H  
} 4sNM#]%|  
@end oJyC{G  
    正如我们所看到的那样,这个类相当的简单,在它的init方法中接受一个url并保存起来,当main函数被调用的时候,它使用这个保存的url创建一个字符串,并将这个字符串传递给NSXMLDocumentinit方法。如果加载的xml数据没有出错,数据会被传递给AppDelegate,它处于主线程中。到此,这个线程的任务就完成了。在主线程中注销操作队列的时候,会将这个NSOperation对象释放。 *Vv ;NA/  
AppDelegate.h +n2x@ 0op  
@interface AppDelegate : NSObject { 9L!Vj J  
    NSOperationQueue *queue; % fA0XRM  
}+ (id)shared;- (void)pageLoaded:(NSXMLDocument*)document;@endAppDelegate.m        #import "AppDelegate.h"#import "PageLoadOperation.h"@implementation AppDelegate _or$^.='  
static AppDelegate *shared; ^6J*yV%  
static NSArray *urlArray; +1h^9 Y'  
- (id)init 9Ki86  
{ ?G!^ |^S*  
    if (shared) mz9Kwxe  
    { bgYM  
        [self autorelease]; aW w`v[v  
        return shared; t MA  
    } M 80Us.  
    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; JK,#dA#  
    } pxDZ}4mOh  
    •    (void)applicationDidFinishLaunching: r'xa' 6&  
    (NSNotification *)aNotification  ^B1vvb  
{ A4(^I u  
        for (NSString *urlString in urlArray) `I6)e{5t  
        { B: {bmvy  
        NSURL *url = p)TH^87  
        [NSURL URLWithString:urlString];        PageLoadOperation *plo = Pw$'TE}  
        [[PageLoadOperation alloc] initWithURL:url]; >A2& Mjo  
        [queue addOperation:plo]; /91H! s  
        [plo release]; B<:i[~`7t  
        } \?g)jY  
} ;&J MBn]J  
- (void)dealloc N_/&xHw  
{ nM R _ ?g  
        [queue release], queue = nil; ]Ms~;MXlx5  
        [super dealloc]; #-e3m/>  
} ^0X86  
+ (id)shared; pjbKMx  
{ fFSW\4JD=  
        if (!shared) { ;]<$p[m  
            [[AppDelegate alloc] init]; 9H.E15B  
        } Q?[k>fu0  
        return shared; 9J2% 9,^  
} IGv>0LOd@  
- (void)pageLoaded:(NSXMLDocument*)document; [Hn+r &  
{ ce+\D'q[  
        NSLog(@"%s Do something with the XMLDocument: %@", "b -KVZ  
             _cmd, document); &?zJ|7rh@|  
} *pI3"_  
@end ly, d =  
+=O8t0y n  
NSOperationQueue的并行控制(NSOperationQueue Concurrency) _NqEhf:8  
        在上面这个简单的例子中,我们很难看出这些操作是并行运行的,然而,如果你你的操作花费的时间远远比这里的要长,你将会发现,队列是同时执行这些操作的。幸运的是,如果你想要为队列限制同时只能运行几个操作,你可以使用NSOperationQueue的setMaxConcurrentOperationCount:方法。例如,[queue setMaxConcurrentOperationCount:2];
级别: 精灵王
UID: 17862
精华: 0
发帖: 553
可可豆: 5526 CB
威望: 5521 点
在线时间: 1134(时)
注册时间: 2010-04-19
最后登录: 2018-11-19
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"直接提交
    顶部