<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一點一滴,編程人生

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      69 隨筆 :: 0 文章 :: 25 評論 :: 0 Trackbacks

    就個人經驗而言,在iphone線程中使用異步NSURLConnection的經驗可以說是一個完全和愉悅搭不上邊的事情。他給我帶來的麻煩可真不少。例如,前幾天,幫客戶定位一個問題的時候發生的事情。

    事情經過是這樣的:客戶反饋,無法正常使用我們提供的某個和網絡相關的功能,網絡回調沒有收到。但是其他回調可以正常工作,并且所有回調都是以同樣的邏輯放在某個地方的。

    我先確認了他的使用方式是否正確,并確認了輸入參數的正確性,并且驗證了回調的正確設置以及回調函數的使用無誤。一切都沒有問題,但是就是無法收到回調。

    一切都那么的神奇,功能的調用并沒有什么特殊的,但是就單單這個功能工作不正常。中間又經過一些確認,發現數據并沒有到達服務端。但是同樣的使用方式在我們自己的環境下工作又是正常的。

    花了將近5個小時,還是沒有發現原因,就在我準備放棄的時候,突然想到,莫非他的調用位置是線程中調用?經過確認,發現果然是在線程中調用的!讓他們使用performOnMainThread的方式調用,終于解決了問題。

    以前遇到過一次在線程中調用異步網絡的情況,請教同事,同事告知,異步網絡需要自己的RunLoop,所以要在線程中使用異步網絡必須有自己的RunLoop,可以將他放到主線程的RunLoop。

    但是,這樣子,多線程的性能必然被降低,因為這樣網絡的工作就都是在主線程中完成的。同時懷疑,這樣子的網絡性能設計不是很低下!

    剛好有點時間,就仔細的翻了一下蘋果的開發文檔,發現其中指出,所有的NSThread都有一個屬于自己的NSRunLoop,而NSURLConnection的回調都會回調到當前線程中!

    這個和我目前遇到的完全不一樣!我無法在當前線程中收到回調!

    又仔細在網絡上搜索之后發現,原來,是因為網絡回調的時候線程的NSRunLoop已經被無效的原因。

    我們常見的線程中網絡調用是這樣的:

    - (void)threadFunc
    {
    NSAutoReleasePool *pool = [NSAutoReleasePool new];
    //do something
    ……

    //send your request
    [NSURLConnection connectionWithRequest:xxx];

    //do some other thing
    ……
    [pool release];
    }

    一般來說,這個函數會很快走完,線程就結束了。所以,當網絡響應回來的時候,你的線程已經結束了。你的網絡回調依賴于該線程的NSRunLoop,但是線程已經結束了,所以你的網絡回調就無法收到!!同理,所有的performAfterDelay之類的api以及NSTimer的在線程中工作都不正常!

    那么,該如何讓他正常工作呢?很簡單,做完事情之前,讓線程不要結束,保持空轉狀態就行了。

    - (void)threadFunc
    {
    NSAutoReleasePool *pool = [NSAutoReleasePool new];
    //do something
    ……

    //send your request
    [NSURLConnection connectionWithRequest:xxx];

    //do some other thing
    ……

    while(shouldExit)
    {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }
    [pool release];
    }

    posted on 2012-07-25 11:14 writegull 閱讀(1970) 評論(1)  編輯  收藏 所屬分類: iphone

    評論

    # re: iphone線程中使用異步網絡的悲催經歷 2016-07-07 13:48 acc
    用AFNetworking就省去這些麻煩了  回復  更多評論
      

    主站蜘蛛池模板: 在线看片免费人成视久网| 91福利免费网站在线观看| 91成人免费观看网站| 亚洲精品第五页中文字幕| 91在线手机精品免费观看| 久久综合亚洲鲁鲁五月天| 免费观看黄色的网站| 亚洲人成日本在线观看| 美女裸身网站免费看免费网站| 亚洲av日韩av无码av| 毛片A级毛片免费播放| 亚洲国产精品美女久久久久| 全部免费国产潢色一级| 日韩在线观看免费完整版视频| 亚洲国产成人无码av在线播放| 国产91免费在线观看| 久久国产亚洲精品| 免费国产怡红院在线观看| 一级毛片无遮挡免费全部| 亚洲成AV人在线播放无码| 未满十八18禁止免费无码网站| 亚洲系列中文字幕| 午夜成人免费视频| 国产免费一区二区三区免费视频| 亚洲精品成人网站在线观看| 182tv免费视视频线路一二三| 亚洲一级高清在线中文字幕| 国产精品免费播放| 全免费a级毛片免费看| 456亚洲人成影院在线观| 亚洲日韩在线观看| 2021在线观看视频精品免费| 亚洲av成人一区二区三区观看在线 | 全亚洲最新黄色特级网站| 黄视频在线观看免费| 亚洲国产夜色在线观看| 日韩精品成人亚洲专区| 91成人在线免费观看| 成人免费网站久久久| 亚洲欧洲国产经精品香蕉网| 亚洲国产综合精品中文字幕|