CFNetwork編程1

學習ASIHTTPRequest的使用,是對apple提供的sdk 中CFNetwork的封裝,實現了很多的功能。簡單總結CFNetwork編程的基本內容。



包括 CFSocket類,CFStream類,CFHTTP類,CFFTP類。

CFStream:

CFReadStreamOpen(CFReadStreamRef ref);打開一個CFRedStream,就可以對其進行讀,寫等操作,這些操作會block,會suspend。可以通過在run loop中註冊該stream可讀、可寫事件以及相應的callback函數,實現異步的讀寫。

CFStream內置支持SSL協議。

例:

CFWriteStreamRef myWriteStream =CFWriteStreamCreateWithFile(kCFAllocatorDefault, fileURL);
CFWriteStreamOpen(myWriteStream);
CFIndex numBytesRead;
UInt8 buf[myReadBufferSize];
numBytesRead = CFReadStreamRead(myReadStream, buf, sizeof(buf));
CFReadStreamClose(myReadStream);
CFRelease(myReadStream);
myReadStream = NULL;

實現異步的收發:

CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host, port, &myReadStream, NULL);//創建連接,myReadStream和指定Host
//創建該流的context
CFStreamClientContext myContext = {0, myPtr, myRetain, myRelease, myCopyDesc};

// 註冊讀寫該流相關的事件

CFOptionFlags registeredEvents = kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered;
if (CFReadStreamSetClient(myReadStream, registeredEvents, myCallBack, &myContext))
{
    CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
}

// 發起連接,open。。。。

if (!CFReadStreamOpen(myReadStream)) {
    CFStreamError myErr = CFReadStreamGetError(myReadStream);
    if (myErr.error != 0) {    // An error has occurred.
        if (myErr.domain == kCFStreamErrorDomainPOSIX) {
        // Interpret myErr.error as a UNIX errno.
            strerror(myErr.error);
        } else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) {
            OSStatus macError = (OSStatus)myErr.error;
            }
        // Check other domains.
    } else
        // start the run loop
        CFRunLoopRun();
}

callback的定義

void myCallBack (CFReadStreamRef stream, CFStreamEventType event, void *myPtr) {
    switch(event) {
        case kCFStreamEventHasBytesAvailable:
       	 	.....
            UInt8 buf[BUFSIZE];
            CFIndex bytesRead = CFReadStreamRead(stream, buf, BUFSIZE);
			.....
            break;
        case kCFStreamEventErrorOccurred:
            CFStreamError error = CFReadStreamGetError(stream);
            reportError(error);
            CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(),
                                              kCFRunLoopCommonModes);
            CFReadStreamClose(stream);
            CFRelease(stream);
            break;
        case kCFStreamEventEndEncountered:
            reportCompletion();
            CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(),
                                              kCFRunLoopCommonModes);
            CFReadStreamClose(stream);
            CFRelease(stream);
            break;
    }
}

還有的方法是POLL,輪詢

// 詳細可參照

http://developer.apple.com/LIBRARY/IOS/#documentation/Networking/Conceptual/CFNetwork/CFStreamTasks/CFStreamTasks.html#//apple_ref/doc/uid/TP30001132-CH6-DontLinkElementID_12






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章