注册 登录
主题 : 网络编程总结
级别: 新手上路
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 N6A|  
)}_}D +2  
    1. 添加源文件和framework {Dy,u%W?  
     N\?__WlBK7  
    开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。 #%#N.tB 5  
    Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部: ol {N^fi K  
     k!6m'}v  
    1.1. 添加源文件: l!\~T"-7;:  
    在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图: aJ1{9 5ea  
iVmy|ewd  
     Kf,An Kkn'  
     ;.R) uCd{=  
    1.2.添加framework: @ @(O##(7  
    将SystemConfiguration.framework 添加进工程。如下图: I58$N+#  
     Aq>?G+  
     3mg:9]X9  
    2. 网络状态 E4_,EeC#  
     *Z2Ko5&Y2  
    Reachability.h中定义了三种网络状态: 6 lEv<)cC  
    typedef enum { z  61Fq  
        NotReachable = 0,            //无连接 CqU^bVs  
        ReachableViaWiFi,            //使用3G/GPRS网络 LA/Qm/T  
        ReachableViaWWAN            //使用WiFi网络 K;w]sN+I  
    } NetworkStatus; #)S&Z><<  
     `v2Xp3o4f  
    因此可以这样检查网络状态:  ]<Q&  
0[7"Lhpd  
    Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”]; wMCgL h\wi  
    switch ([r currentReachabilityStatus]) { &W `7 b<  
            case NotReachable: cBZJ  
                    // 没有网络连接   
                    break; A.$P1zwC  
            case ReachableViaWWAN: RfCu5Kn  
                    // 使用3G网络 P1$D[aF9$  
                    break; ? 5OK4cR  
            case ReachableViaWiFi: Wk!<P" nHd  
                    // 使用WiFi网络 .O&YdUo  
                    break; ]-;JHB5A_:  
    } S5UQ   
     @,W5K$Ka=  
    3.检查当前网络环境 lJx5scN [  
    程序启动时,如果想检测可用的网络环境,可以像这样 $uRi/%Q9  
    // 是否wifi <HpUP!q8v  
    + (BOOL) IsEnableWIFI { _[wG-W/9R  
        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable); $) qL=kR  
    } ^B7Ls{  
P1Iy >%3  
    // 是否3G l%2 gM7WMY  
    + (BOOL) IsEnable3G { N!-P2)@  
        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable); >m%7dU  
    } ~Ra8(Koc D  
    例子: z;N`jqo   
    - (void)viewWillAppear:(BOOL)animated {     r{Mn{1: O  
    if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && cXYE !(  
            ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) { D$TpT X\  
            self.navigationItem.hidesBackButton = YES; Np$ue }yr  
            [self.navigationItem setLeftBarButtonItem:nil animated:NO]; (eHTXk*V`  
        } { qCFd  
    } B9c gVTLj  
IQ xi@7%&  
    4. 链接状态的实时通知 q[+KQ,  
    网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户: y*=Ipdj  
     sx'eu;S  
    Reachability 1.5版本 4#ikdjB;  
    // My.AppDelegate.h 3h A5"G+7  
    #import "Reachability.h" BV}sN{  
k6 RH]Ha  
    @interface MyAppDelegate : NSObject <UIApplicationDelegate> { oP:R1<  
        NetworkStatus remoteHostStatus; z"FxKN~Z  
    } <l eE.hhf.  
Z4gn7 'V  
    @property NetworkStatus remoteHostStatus; 4 DV,f2:R4  
K\mFb  
    @end J L1]auO*  
p+7#`iICE  
    // My.AppDelegate.m wZKmU  
    #import "MyAppDelegate.h" ;r.#|b  
4.~<|T8  
    @implementation MyAppDelegate @`iz0DPG?Y  
    @synthesize remoteHostStatus; M<Dvhy[  
$gL^\(_3H  
    // 更新网络状态  um2}XI  
    - (void)updateStatus { LE?sAN  
        self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; gplrJaH@  
    } 2 ksbDl}  
3l$D%y  
    // 通知网络状态 pP# |: %  
    - (void)reachabilityChanged:(NSNotification *)note { 4jjo%N  
        [self updateStatus]; &78lep  
        if (self.remoteHostStatus == NotReachable) { b"OHXu  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil) \#F>R,  
                         message:NSLocalizedString (@"NotReachable", nil) E, oR.B  
                        delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; "QBl "<<s  
            [alert show]; VS_I'SPPIc  
            [alert release];  ?H_>?,^  
        } s'Qmr s a  
    } nu2m5RYx  
E #!.;AQ  
    // 程序启动器,启动网络监视 vw-y:,5`t8  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { 9j5-/   
     O&VA79\UO  
        // 设置网络检测的站点 ^a1k"|E?f  
        [[Reachability sharedReachability] setHostName:@"www.apple.com"]; ^nDa-J$  
        [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; b8Hz l!zO  
        // 设置网络状态变化时的通知函数 :0bjPQj  
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) ]M~ 7L[  
                                                 name:@"kNetworkReachabilityChangedNotification" object:nil]; 5FsfJpw  
        [self updateStatus]; VAe[x `  
    }  OAgZeK$  
ZQ-6n1O  
    - (void)dealloc { -av=5hm  
        // 删除通知对象 :EH>&vm  
        [[NSNotificationCenter defaultCenter] removeObserver:self]; Q"3gvIyc  
        [window release]; C@pn4[jTl  
        [super dealloc]; #6pJw?[  
    } bwJluJ, E  
     b%d,X-3  
    Reachability 2.0版本 I<Mb /!TQ  
     Jc fGe4  
} na@gn  
    // MyAppDelegate.h @iBmOt>3  
    @class Reachability; e-VGJxR  
,v?FR }v  
        @interface MyAppDelegate : NSObject <UIApplicationDelegate> { XdnpL$0  
            Reachability  *hostReach; P5GV9SA  
        }  %CUwD  
~c*kS E2X  
    @end 8m[o*E.4F  
J.O{+{&cd  
    // MyAppDelegate.m TpdYU*z_Br  
    - (void)reachabilityChanged:(NSNotification *)note { vV"I}L  
        Reachability* curReach = [note object]; /wkrfYRs  
        NSParameterAssert([curReach isKindOfClass: [Reachability class]]); {Eqx'j  
        NetworkStatus status = [curReach currentReachabilityStatus]; +&E\w,Vq^  
     `_BmVms  
        if (status == NotReachable) { @twi<U_  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName"" sI{?4k  
                              message:@"NotReachable" "EE (O9q  
                              delegate:nil {z9z#8`C;  
                              cancelButtonTitle:@"YES" otherButtonTitles:nil]; en6;I[\  
                              [alert show]; #<#-Bv  
                              [alert release]; SA%)xGRW  
        } YHxQb$v)  
    } C]h_co2eI  
                               >ZU)bnndA  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { t%@u)bp  
        // ... lAo4)  
                   .LbAR u  
        // 监测网络情况 _@ g\.7@0G  
        [[NSNotificationCenter defaultCenter] addObserver:self $6 4{Ff  
                              selector:@selector(reachabilityChanged:) ]Z52L`k  
                              name: kReachabilityChangedNotification <)Y jVGG  
                              object: nil]; 7`^=Ie%(K  
        hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; #5iwDAw:|r  
        hostReach startNotifer]; #nmh=G?\Sm  
        // ... xmfZ5nVL  
    } VA %lJ!$  
/)?qD  
jzwHb'4B3  
二:使用NSConnection下载数据 +6^hp-G7  
     2+*o^`%4P  
    1.创建NSConnection对象,设置委托对象 NSq29#  
     >\3N#S"PF  
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]]; J gV4-B 0  
    [NSURLConnection connectionWithRequest:request delegate:self]; ~ftR:F|9  
     H.o3d/8:  
    2. NSURLConnection delegate委托方法 =F5zU5`i  
        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;   IIF <Zkpb  
        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;   ~4xn^.w  
        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;   = '-/JH~  
        - (void)connectionDidFinishLoading:(NSURLConnection *)connection;   J*AYZS-tSE  
-<e_ ^  
    3. 实现委托方法 _94R8?\_V7  
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 0n={Mb  
        // store data $I<\Yuy-M9  
        [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存 ?30pNF|  
    } }%^ 3  
     2Zg%4/u,Zp  
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 1Ve~P"w  
           /* appends the new data to the received data */ _ x$\E  
        [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后 R0G!5>1i  
    } qca=a }  
[jGE {<Je  
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { czB),vooz  
        // 错误处理 ;q#Pl!*5  
    } o|_9%o52'  
;wZplVB7y  
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection { (nYGN$qC9  
        // disconnect Qo*OC 9E`  
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;   Xo6zeLHO  
        NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; #vAqqAS`,  
        NSLog(returnString); by$mD_sr  
        [self urlLoaded:[self urlString] data:self.receivedData]; OM`Ws5W}f  
        firstTimeDownloaded = YES; PWO5R]  
    } |:SIyXGbY  
#RKd >ig%  
三:使用NSXMLParser解析xml文件 k,ezB+  
[+!+Yn6:  
    1. 设置委托对象,开始解析 &v feBth  
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做: !FvL2L  
    // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable -$,'|\Y  
    // because it gives less control over the network, particularly in responding to connection errors. i?|u$[^=+  
    [parser setDelegate:self]; 3{TE6&HIa  
    [parser parse]; ]Y$jc  
8~O0P=  
    2. 常用的委托方法 j%':M  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName $yUPua/-  
                                namespaceURI:(NSString *)namespaceURI nj- LG!"a  
                                qualifiedName:(NSString *)qName =NWzsRl,  
                                attributes:(NSDictionary *)attributeDict; 6=*n$l# }  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName f>m ! }F:  
                                namespaceURI:(NSString *)namespaceURI eQMa9_  
                                qualifiedName:(NSString *)qName; R~;8v1>K  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; Pj5:=d8z(  
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; _T;Kn'Gz(&  
\{qtdTd  
    static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; 98vn"=3  
+,)Iv_Xl$  
    3.  应用举例 o :j'd  
    - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error V@\u<LO0G  
    { H8m[:K]_H  
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; UlPGB2B  
        [parser setDelegate:self]; hE'>8{  
        [parser setShouldProcessNamespaces:NO]; v|@EuN14<  
        [parser setShouldReportNamespacePrefixes:NO]; $8Z4jo  
        [parser setShouldResolveExternalEntities:NO]; 3ik~PgGoKQ  
        [parser parse]; =%B}8$.|  
        NSError *parseError = [parser parserError]; mILCC} K t  
        if (parseError && error) { oq,*@5xV2  
            *error = parseError; &4*f28 s  
        } v9Lf|FXo&  
        [parser release]; 4.> y[_vu  
    } V}FH5z |  
U? ;Q\=>  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI CX ; m8  
                                        qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{ /XdLdA!v  
        // 元素开始句柄 f9O_M1=|lo  
        if (qName) { O8-Z >;  
            elementName = qName; z9v70 q  
        } 29&F _  
        if ([elementName isEqualToString:@"user"]) { L^2wEF  
            // 输出属性值 u]]mbER*t#  
            NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]); $F]*B `  
        } 4y $okn\}i  
    } 4~hP25q  
 O@skd2  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI +;bZ(_ohG  
                                        qualifiedName:(NSString *)qName s~c cx"HH  
    { /2 qxJvZ  
        // 元素终了句柄 }^*`&Lh  
        if (qName) { []?*}o5&>T  
               elementName = qName; G}aM~,v  
        } gm1RQ^n,@.  
    } o<5+v^mt#  
H)Z$j&S{  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string eu//Q'W  
    { c4bvJy8  
        // 取得元素的text pezfB{x?  
    } J8[aVG  
TeyFq0j@'  
    NSError *parseError = nil; >;}(? +|f  
    [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; }}Gkipp  
     ?q y*`  
        
清空我的评分动态本帖最近评分记录: 共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中的很多应用程序非常的笨重,他们有好的界面,但操作性很差,比如说当程序从网上或本地载入数据的时候,界面被冻结了,用户只能等程序完全载入数据之后才能进行操作。 5e^z]j1Yv  
当打开一个应用程序时,iphone会产生一个包含main方法的线程,所用程序中的界面都是运行在这个线程之中的(table views, tab bars, alerts…),有时候我们会用数据填充这些view,现在问        题是如何有效的载入数据,并且用户还能自如的操作程序。方法是启动新的线程,专门用于数据的下载,而主线程不会因为下载数据被阻塞。 "71Y{WQ   
不管使用任何编程语言,在实现多线程时都是一件很麻烦的事情。更糟糕的是,一旦出错,这种错误通常相当糟糕。然而,幸运的是apple从os x10.5在这方面做了很多的改进,NSThread的引入,使得开发多线程应用程序容易多了。除此之外,它们还引入了两个全新的类,NSOperation和NSOperationQueue。 v|nt(-JX  
接下来我们通过一个实例来剖析如何使用这两个类实现多线程。这里指示展示这两个类的基本用法,当然这不是使用他们的唯一办法。 +9 .GNu  
如果你熟悉java或者它的别的变种语言的话 ,你会发现NSOperation对象很像java.lang.Runnable接口,就像java.lang.Runnable接口那样,NSOperation类也被设计为可扩展的,而且只有一个需要重写的方法。它就是-(void)main。使用NSOperation的最简单的方式就是把一个NSOperation对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成。然后它被队列释放。 n m.5!.  
下面的例子中,使用一个获取网页,并对其解析程NSXMLDocument,最后将解析得到的NSXMLDocument返回给主线程。 ?v&2^d4C*F  
     'wo}1^V  
PageLoadOperation.h@interface PageLoadOperation : NSOperation { Qa" 4^s  
    NSURL *targetURL;} /{-J_+u*%  
@property(retain) NSURL *targetURL; {z@a{L:SC  
- (id)initWithURL:(NSURL*)url;@end )!'7!" $  
CJ6vS  
PageLoadOperation.m C-H6l6,  
#import "PageLoadOperation.h"#import "AppDelegate.h"@implementation PageLoadOperation@synthesize targetURL;- (id)initWithURL:(NSURL*)url;{ Ba76~-gK$  
    if (![super init]) return nil; k>:\4uI|<\  
    [self setTargetURL:url]; Eg1|Kg\&  
    return self;}- (void)dealloc { QiNLE'19^  
    [targetURL release], targetURL = nil; rE?B9BF3O  
    [super dealloc]; 8TYoa:pZ  
} Q 34-a"6)  
- (void)main e_3B\59k  
{ 03!#99  
    NSString *webpageString = [[[NSString alloc] zRB LkrC  
    initWithContentsOfURL:[self targetURL]] autorelease]; w=[ITQ|W%  
    NSError *error = nil; 5IbCE.>iU  
    NSXMLDocument *document = [[NSXMLDocument alloc] '2SZ]   
    initWithXMLString:webpageString <,J O  
    options:NSXMLDocumentTidyHTML error:&error]; A%~t[ H  
    if (!document) { t6~~s iQI'  
        NSLog(@"%s Error loading document (%@): %@", VgS2_TU  
        _cmd, [[self targetURL] absoluteString], error);  y)3OQ24  
         return; gj82qy\:  
    } G~/*!?&z  
    [[AppDelegate shared] [>lQi X  
    performSelectorOnMainThread:@selector(pageLoaded:) d,o|>e$  
         withObject:document waitUntilDone:YES]; f 2k~(@!h  
    [document release]; R  xc  
} Sb`SJ):x  
@end X&A2:A 6\+  
    正如我们所看到的那样,这个类相当的简单,在它的init方法中接受一个url并保存起来,当main函数被调用的时候,它使用这个保存的url创建一个字符串,并将这个字符串传递给NSXMLDocumentinit方法。如果加载的xml数据没有出错,数据会被传递给AppDelegate,它处于主线程中。到此,这个线程的任务就完成了。在主线程中注销操作队列的时候,会将这个NSOperation对象释放。 s 4n<k]d  
AppDelegate.h z\Z+>A  
@interface AppDelegate : NSObject { Sy^@v%P'A  
    NSOperationQueue *queue; 0bjZwC 4J  
}+ (id)shared;- (void)pageLoaded:(NSXMLDocument*)document;@endAppDelegate.m        #import "AppDelegate.h"#import "PageLoadOperation.h"@implementation AppDelegate wIF)(t-):  
static AppDelegate *shared; |oR#j `  
static NSArray *urlArray; )2R]KU_=g  
- (id)init uIR   
{ _$K kSMA~_  
    if (shared) [!4V_yOb  
    { vX$|/74  
        [self autorelease]; Iz&<rL;s  
        return shared; #,OiZQJC  
    } x6Q_+!mnk  
    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; jK2gc^"t  
    } 8x9;3{R   
    •    (void)applicationDidFinishLaunching: 0&c<1;  
    (NSNotification *)aNotification pe VzF'F  
{ $LtCI  
        for (NSString *urlString in urlArray) bs)Ro/7}  
        { B XO,  
        NSURL *url = %< Jj[F  
        [NSURL URLWithString:urlString];        PageLoadOperation *plo = }p*WH$!~  
        [[PageLoadOperation alloc] initWithURL:url]; 9<5ii  
        [queue addOperation:plo]; 8cj}9}k  
        [plo release]; u89Q2\z~"M  
        } avUdv V-  
} +>:[irf  
- (void)dealloc @`HW0Y_:  
{ #2%8@?_-M  
        [queue release], queue = nil; t!0 IQ9\[*  
        [super dealloc]; $Y%,?>AL<  
} j{H IdP  
+ (id)shared; % xBQX  
{ TtgsM}Fm  
        if (!shared) { ?Xq kf>  
            [[AppDelegate alloc] init]; * K0aR!  
        } I3YSW  
        return shared; ;p:CrFv  
} h-\+# .YP  
- (void)pageLoaded:(NSXMLDocument*)document; %/RT}CBBsW  
{ ~2QD .(  
        NSLog(@"%s Do something with the XMLDocument: %@", R)%I 9M,  
             _cmd, document); EH]qYF.  
} wLo<gA6;  
@end 4cDe'9 LA  
r`PD}6\  
NSOperationQueue的并行控制(NSOperationQueue Concurrency) ,+FiP{`  
        在上面这个简单的例子中,我们很难看出这些操作是并行运行的,然而,如果你你的操作花费的时间远远比这里的要长,你将会发现,队列是同时执行这些操作的。幸运的是,如果你想要为队列限制同时只能运行几个操作,你可以使用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
最后登录: 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 重点学习了

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

描述
快速回复

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

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

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