發表文章

目前顯示的是 12月, 2014的文章

iOS Core Data and multithread

圖片
    對於我們初學Core Data的人來說,在Xcode 5的時代,若要使用Core Data來存儲資料,第一件事就是在建立專案的時候只能選擇空的應用程式,才能有勾選使用Core Data的選項。如果選擇建立single view專案的話,那就沒有使用Core Data選項可選了。所以網路[1]上有不少人在討論,若已經建立專案,而當初沒有勾到Core Data選項時,該如何加入之。還好,到了XCode 6, 現在single view專案,已經有Core Data選項可以選了。     但是預設建立的Core Data, 在讀寫資料時,其實是以UI Thread來作業的。也就是說和所有UI有關的元件共用主要的Thread。這樣一來,最明顯的問題,就是在做Import/Export工作的時候,會造成App卡住的現象。   以簡單的新增資料數筆至Core Data來做實驗,就會發現,當新增的資料愈多時,卡住的時間就會愈久。如以下程式: AppDelegate *delegate = ( AppDelegate *)[[ UIApplication sharedApplication ] delegate ];      Xxx *xx;          for ( int i= 0 ; i     xx = [ NSEntityDescription insertNewObjectForEntityForName : @"Xxx" inManagedObjectContext :delegate.managedObjectContext];                  xx. startDate = [ NSDate   date ];     xx. stopDate = [xx. startDate dateByAddingTimeInterval :( arc4random () % 7200 + 1 )];     xx. distance = @( 5 ) ;              } [delegate.managedObjectContext save : nil ]; 這個程式片斷使用預設的managed object cont

iOS Table View 加入Search功能(使用Core Data當資料來源,並客製化Table View Cell)

圖片
    其實如何加入Search功能至Table View的做法是有很多人討論的,只要google一下就可以找到許多。目前大部份人都說要使用search display controller,也就是在XCode裡右下角的元件庫裡看到的Search Bar and Search Display Controller,如下圖。只要把它拉到你的Table View裡面,然後再加入一些程式碼就可以了。但大部份都是很簡單的利用NSArray來當做Table View的資料來源。例如[1], 是一個很好教學文件,它也告訴我一個重要的觀念: search display controller 會自帶一個Table View。但是它用NSArray來做Table View的資料來源。就連我手上談論iOS程式的書(1)都有提到這個議題,但同樣地,都是使用Array來當資料來源。     所以當我的專案是使用Core Data當資料來源時,這變成了一個問題。不過,這就是程式開發者的工作,不是嗎?當然,我們有許多選擇。例如,可以把Core Data的資料先轉成NSArray啦。不過,這是笨方法。因為當初使用Core Data,就是有一個好用的NSFetchedResultsController可以使用,它不但協助我們處理掉讀取Core Data的細節,還考量到效能的問題。實在沒有理由,要棄之不用。     另一個問題是,我的專案裡的Table View Cell是客製化的,也就是說不是預設的只有顯示一個字串,而是我自己拉Label,拉UIImage...。這會有什麼問題嗎?問題出在search display controller會自帶結果Table View,不知道要如何去客製化它的Cell。總不能讓Search結果的Table View Cell長的樣子和原來的不一樣吧!     最後一個問題是,現在iOS8剛出來,有了一些改變。原本這個議題,大家的作法都是使用search display controller來做,有趣的是,居然文件裡講,在iOS8中,請不要再用這個類別了。不過,若要相容於iOS7,那還是用search display controller。 以下,分別來討論解決的方法和概念。 Core Data當資料來源,沒問題!Stackoverflow上就有

Bluetooth Serial Port Setting on Mac OS X 10.10 (Yosemite) and some others

圖片
    有一天我哥和我談到他在玩Arduino可以透過藍牙來搖控模型車,只是都要用Android手機,無法用iPhone來搖控。這有點奇怪,我想要弄清楚為什麼是這樣,真的是這樣麼?首先我找到Hock Chen寫的一篇文章[1],談論的內容跟這個問題很相關。Hock Chen主要在教我們如何用MIT AI2這個工具寫一支可以在Android手機上跑的App,這支App主要是可以透過藍牙送出字串到Arduino+HC 06的版子上面。然後也教我們如何在Arduino上面寫程式,可以將收到的字串顯示在LCD顯示器上。      MIT AI2是個很有趣的工具,只要拖拉元件,再玩拼圖就可以寫成App了。我依照Hock Chen的文章把這支App做出來,發現主要只是利用一個藍牙client元件來送出字串而已。可是這樣就可以運作,實在也太神奇了。因為藍牙是個多才多藝的玩意,有藍牙滑鼠,有藍牙鍵盤,有藍牙音樂,有藍牙耳機。那這個元件到底做了什麼呢?     因為我手上也沒有Arduino的硬體,所以我想用一台電腦來接收看看,是不是可以收到這支App送出來的字串。我在一台沒有藍牙硬體的Vista電腦上安裝了一支藍牙donger, 如下圖示。它使用broadcom晶片,和widcomm的軟體。     在安裝好驅動程式後, 先把手機和電腦做個配對。之後打開藍牙的設定, 如下圖: 在Windows8.1, 我裝了一支CSR晶片的BT 4.0 donger, Win8.1會自己認到, 之後要設定藍時, 只要到裝置和印表機, 找到該donger按右鍵選Bluetooth設定即可。 我在COM連接埠的設定頁中, 新增了一個連入的COM9埠。然後, 打開putty, 連到這個COM9埠去。如下圖示: 然後, 等putty的畫面出現後, 就可以使用andriod手機, 打開那支App來連到電腦, 再輸入幾個字串來送出去。 此時可以看到成功的把字串由手機送出到電腦了。 所以這支用MIT AI2拉出來的App,到底是做什麼呢?我知道是透過藍牙送字串啦。但由以上送字串到電腦的設定過程中,可以了解我在電腦上設了一個連入的COM埠,而且在這個COM埠上用putty來接收字串。其實這個過程就是所謂的藍牙序列埠,也就是把以前的RS232的實體線,用無