Posts tagged ‘Obj-C’

Magic of NSLog

การ Log ที่ดี ก็มีผลให้การทำงานเราสะดวกรวดเร็วขึ้นนะครับ แน่นอน การใส่สัญลักษณ์ไว้ใน Log ก็เป็นวิธีการแบบลูกทุ่งๆอย่างนึงที่ใช้ง่ายและได้ผล แต่เยอะๆเข้าแทนที่จะช่วยให้เร็วขึ้นมันจะเป็นตรงกันข้าม เพราะลายตากับ Log ไปหมด หรือจะให้ระบุรายละเอียดกันทุกบรรทัด ก็เสียเวลาเกินไป ใน Entry นี้ ผมเอา Trick การ Log ให้มีประสิทธิภาพมากขึ้นมาฝากครับ

Trick #1 : รู้รึเปล่า ว่าการทำงานพร้อมกับการ Log ค่าไปด้วย ทำให้เป็นการลดประสิทธิภาพการทำงานของ App ลงไปเยอะเลย ก่อน  Submit app ขึ้น App store เราควรจะ remove log ของเราออกไปด้วย …จริงอยู่ว่า App ทั่วไปอาจไม่มีผลต่อประสิทธิภาพโดยนัย แต่ถ้าเป็นเกม …มีนัยครับ ดังนั้น เราจะสร้าง Log ของเราเองขึ้นมา ที่ให้ Log ค่า ตอนที่ XCode ตั้งค่าเป็น Debug mode เท่านั้น ใส่โค้ดพวกนี้ในไฟล์ xxx_Prefix.pch ของโปรเจค เพื่อให้มีผลกับทั้งโปรเจคครับ

#ifdef DEBUG
# define JELog(fmt,...) NSLog(@"%@",[NSString stringWithFormat:(fmt), ##__VA_ARGS__]);
#else
# define JELog(...)
#endif

อธิบายโค้ดดังกล่าวได้ว่า เราสร้าง JELog ขึ้นมาเพื่อให้มันทำงานเหมือน NSLog เลย แต่จะพิมพ์ออกทางหน้าจอเมื่อ Preprocessor Macro ถูกเซตคำว่า DEBUG เอาไว้ แต่ถ้าไม่ได้เซตก็ไม่ต้องทำอะไร

ส่วนการเซตค่า  Preprocessor Macro ไปเลือกที่ Project->Edit Project Settings เลือก Debug ในช่อง Configuration และใส่ค่า DEBUG (หรือคำอื่นๆที่นิยามไว้) ใน Preprocessor Macro เซคชั่น GCC 4.2 – Preprocessing

…แค่นี้แหละครับ เสร็จแล้ว คราวนี้เรา Build ในโหมด Release ก็ไม่มี Log มาบั่นทอนประสิทธิภาพ App เราแล้ว

Trick #2: จะดีแค่ไหน ถ้าการ Log ทำให้เรารู้ได้ว่า มันโดน Log มาจาก Function อะไร และบรรทัดไหน เราสามารถเพิ่มมันได้เอง ในรูปแบบที่เราต้องการ และไม่ต้องเหนื่อยมาใส่แบบลูกทุ่งทีละบรรทัดทีละ Log ด้วย ทำได้ง่ายๆแบบนี้ครับ

#define JELog(fmt,...) NSLog((@"%s-%d:" fmt),__PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

เพียงเท่านี้ เราก็ Log สิ่งที่เราต้องการพร้อมชื่อ Function และบรรทัดนั้นได้ง่ายๆแล้วครับ นอกจากนี้ยังมี __FILE__ เพื่อ log ชื่อไฟล์ชื่อนั้นอีก แต่ผมไม่ใส่เพราะผมไม่ใช้ อิอิ

ครับ สำหรับ Entry นี้ก็คงกล่าวถึงแค่นี้ ส่วนถ้าใครยังไม่สะใจอยากแต่งอยากเติมอีก ก็เข้าไปดูในเครดิตครับ มีคนทำไว้หลายแบบเหมือนกันสำหรับผม แค่นี้ก็สบายแล้ว หุหุ …ว่าแล้วก็จบเท่านี้ดีกว่า Happy Logging นะครับ ;)

Credits:

@memogames
iphoneprogrammingfordummies.blogspot.com
Stack Overflow : NSLog Tip & Trick

มีนาคม 24, 2011 at 5:23 pm ใส่ความเห็น

How to make XCode 3 with iOS SDK4 can build iOS SDK3.1.x

จาก Entry ก่อนๆหน้านี้ทีเคยบ่นๆไปเรื่องที่ XCode3 ตัวล่าสุด จะมาพร้อมกับ iOS ตั้งแต่เวอร์ชั่น 3.2 ขึ้นไป ผลก็คือ เราไม่สามารถ test application ของเราได้ว่า มันรันบน iOS3 ได้มั้ย

แอปเปิลคงตั้งใจจะดัน iOS4 เป็นมาตรฐานของ iPhone App แต่ในความเป็นจริง มาตรฐานการใช้งานมันอยู่ที่ “เครื่องมัน Jailbreak ได้ถึงเวอร์ชั่นไหนแล้ว” ดังนั้นสำหรับผู้พัฒนาบางทีก็ต้อง test กับ iOS เก่าๆซักนิดอย่าง iOS3 ด้วย Entry นี้จึงนำเสนอวิธีการ “ทำให้ XCode with iOS4 สามารถ Build กับ iOS3 ได้ด้วย!! ” เริ่มกันเลยครับ

สิ่งที่ต้องการ

1. iPhone SDK with iOS3 และ iOS4 ที่ติดตั้งกันแบบแยกโฟลเดอร์

วิธีการติดตั้งแบบแยกโฟลเดอร์ จะเปลี่ยนตอนเลือก Destination หรือติดไปก่อน เสร็จแล้วค่อยสร้าง folder ไว้อันนึงแล้วลากมาใส่จาก folder Developer แบบดิบๆเลยก็ได้ครับ

2. Terminal หาไม่ยากเลยครับ เครื่องมันมีมาแล้ว

วิธีการที่จะทำก็คือ สร้าง Symbolic link (หรือที่ในวินโดวส์เรียกว่า Shortcut) ที่ XCode จะทำการค้นหา Library ของ iOS3.x ลงไป ซึ่งก็จะอ้างอิงจาก iPhone SDK with iOS3 นั่นแหละครับ ขั้นตอนมีดังนี้

ผมขอแทน ${SDK3} = path ของ iOS3 SDK และ ${SDK4} = path ของ iOS4 SDK นะครับ

จากนั้นเปิด Terminal ขึ้นมา จากนั้น พิมพ์คำสั่งดังนี้

sudo ln -s ${SDK3}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.?.sdk ${SDK4}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.?.sdk

จากนั้นใส่ password ของเครื่อง หลังจากนั้นเมื่อเปิด XCode ขึ้นมาใหม่ จะพบว่ามี Library ของ iOS3.1.? แล้วครับ ง่ายมากๆ

แต่อย่างไรก็ตาม วิธีการนี้ “ใช้ได้กับ Device เท่านั้นนะครับ Simulator ไม่ได้” เพราะ Simulator เป็น Simulator ที่ลง iOS4 อยู่แล้วครับ (หรือจะมีใครเขียน Script ให้เลือก simulator ตอน จะ run บน simulator ได้ก็แบ่งผมมั่งนะครับ อิอิ)

Entry นี้ก็ขอจบแต่เพียงเท่านี้ครับ หวังว่าจะมีความสุขจากการทำแอพ 2 เวอร์ชั่นโดยไม่ตัองสลับ XCode แล้ว …Happy XCoding ครับ :D

สิงหาคม 8, 2010 at 1:57 am 2 ของความคิดเห็น

iPhone’s project multi-target programming

ท่ามกลางสถานการณ์บ้านเมืองรุนแรงอย่างนี้ อัพบลอกดีกว่า (เอ๊ะ ไม่เกี่ยว) บลอก Entry นี้จริงๆควรจะอัพขึ้นไปตั้งแต่อาทิตย์ที่แล้ว แต่ด้วยเหตุผิดพลาดบางประการ ที่พิมพ์ไปเสร็จแล้วพออัพขึ้น ที่พิมพ์ไว้ดันหายไปไหนหมดก็ไม่รู้ จากนั้นก็ต้องมานั่งบิ๊วอารมณ์กันใหม่อีกรอบ บัดนี้ก็ถึงเวลาเขียนอีกรอบแล้ว

ในการพัฒนา App ไม่ว่าจะบน Mac หรือ iPhone ก็ตาม คงจะเคยเห็นกันว่าบาง App มีหลายเวอร์ชัน เช่น Lite, Standard, Full, Pro, etc.. ซึ่งความแตกต่างส่วนมากก็มักจะเป็นเรื่องของการจำกัด Feature หรือ App บางตัวที่อยู่บน Platform Mac ก็มาอยู่บน iPhone ต่อ อย่างเช่นเกม plant vs zombie หรือ twitter client อย่าง echofon เป็นต้น

ถ้าถามหลายๆคนถึงวิธีการ Develop App พวกนี้ให้เป็นหลายๆเวอร์ชั่นดังกล่าว หลายๆคนอาจจะใช้วิธีการ Duplicate project โดยการ Copy file ทั้งโปรเจคมา แล้วเข้าไปแก้โค้ด ตัด feature ไปตามเวอร์ชั่นๆไป (ดูไม่ make sense เท่าไหร่ แต่ผมเชื่อว่ามี และเยอะด้วยที่ทำแบบนี้) ผมเองก็เคยเช่นกันครับ ทำ App 8 เวอร์ชั่นเลยทีเดียว(จริงๆก็ไม่ได้เห็นด้วย แต่เขาสั่งมาก็ต้องทำ) ปัญหาที่เจออย่างหนักหน่วงเลยก็คือ “การแก้ไข Bug ยุ่งยากและเสียเวลาเป็นที่สุด” เพราะบั๊ก 1 จุดต้องใช้เวลาเพิ่มเป็น 8 เท่าและความแน่นอนว่าการแก้แบบเดียวกันกับโปรเจคเวอร์ชั่นต่างๆกัน มันอาจใช้ไม่ได้ผลซะด้วย

ดังนั้นการทำ App หลายๆเวอร์ชั่นด้วยวิธีการ Duplicate project ไม่น่าจะเป็นทางเลือกที่ควรนัก สำหรับการทำโปรเจคหลายๆเวอร์ชั่น โดยเฉพาะตอนที่ iPad มันเริ่มเข้ามาแล้วอย่างเช่นตอนนี้ ตามจริงมันก็ไม่ควรเป็นแบบนั้นอีกเช่นกัน ในเมื่อ XCode มี Target ให้ใช้อยู่ แล้วทำไมเราถึงไม่ใช้มันล่ะ

Target คืออะไร? Target เปรียบเสมือนพิมพ์เขียวที่กำหนดค่าต่างๆในขั้นตอนการ build ผลก็คือ เราสามารถกำหนดได้ว่าตั้งแต่ target ไหนชื่ออะไร ใช้ไอค่อนตัวไหน ไฟล์ไหนบ้างที่จำเป็นต่อการ build ยันรูปแบบผลที่ได้ว่าต้องการเป็น Application หรือ static library

เวลาเรา Create project ขึ้นมาซักตัว Target จะมีมาให้โดยปรกติเลย 1 ตัว ซึ่งจะอยู่ใน Section Targets ซึ่งเราสามารถเพิ่มได้ตอนไหนก็ได้ โดยการไปที่ Menu Project > New Target… จากนั้นจะขึ้น Window ขึ้นมาให้เลือก Target แบบที่เราต้องการ จากนั้นก็ตั้งชื่อ Target ที่สร้างขึ้น กด Finished ก็เป็นอันเสร็จเรียบร้อย (ตอนนี้เรากำหนดรูปแบบได้แล้ว)

ผลที่ได้จะได้ Target อันใหม่มา 1 อันและ Plist สำหรับ Target นั้นอีก 1 ไฟล์ Plist ก็เป็นที่รู้กันว่าไว้สำหรับการตั้งค่าต่างๆเช่น icon, bundle id, bundle name, etc… ซึ่งเราก็สามารถกำหนดได้ตามต้องการ Target ตัวใหม่ก็เช่นกันเราสามารถกำหนด Framework ที่ใช้ product name, platform ของ Application, etc… ตั้งค่าได้ทั้งหมดราวกับว่ามันเป็นคนละโปรเจคนั่นแหละครับ

องค์ประกอบของ Target ก็มีต่างกันไป ใน Entry นี้ขอพูดถึงแต่แบบ Application เท่านั้นนะครับ Application จะประกอบด้วย 3 ส่วนคือ

component.png

  1. Copy Bundle Resources – เป็นส่วนของ Resource ต่างๆใน Project พวก รูปภาพ, ไฟล์เสียง, วิดีโอ, ฯลฯ
  2. Compile Sources – เป็น Source code ล้วนๆครับ เอาแต่ไฟล์ .m เท่านั้น แล้วก็สำหรับ project จะต้องมี main.m ด้วยนะครับ อย่าลืม ไม่งั้น App จะรันไม่ได้นะครับ สำคัญมาก!!
  3. Link Binary With Libraries – เป็น Framework ที่ใช้ร่วมครับ ปรกติก็จะมี UIKit.framework ตัวนึงละ (สำหรับ iPhone/iPad) หรือไม่ก็ Cocoa.framework (สำหรับ Mac App)

วิธีการก็คือ Target ไหนใช้อะไร Compile บ้างก็ลากใส่เข้าไปตามหมวดหมู่ที่บอกข้างต้นครับ ไม่มีอะไรมาก หรือเวลาที่เรา Add ไฟล์อะไรก็ตามเข้ามาใน Project จะมี Sheet ขึ้นมาถามเราว่า ไฟล์นั้นจะ Copy หรือไม่ จะ link กับ Project อะไรยังไง ก็ให้ลองสังเกตด้านล่างครับ ว่าจะมีถาม Target ไหนด้วย เราก็สามารถเพิ่ม Resource ให้กับแต่ละ Target ผ่านทางนี้ได้เช่นกัน

addtoproj.png

อันนี้เป็นผลพลอยได้ของการสร้าง Target ตั้งแต่แรกๆครับ ส่วนถ้าไม่ได้ทำไว้แต่แรกก็ต้องมาลกาเพิ่มเอาเอง หรืออีกวิธีนึงคือ Duplicate target เอาแล้วค่อยเพิ่ม/ตัดออก เอาก็ยังได้ แต่วิธีนี้ต้อง config อะไรเยอะหน่อยเพื่อไม่ให้มันทับกัน และผมจะไม่ขอพูดถึงในที่นี้นะครับ มันค่อนข้างเยอะ

ต่อไปเป็นวิธีการเลือก Target วิธีการไม่ยากเลย กำหนดเอาที่ปุ่มด้านซ้ายบน กดแล้วจะขึ้น Menu ขึ้นมา ก็เลือก Target ที่ต้องการ build แค่นี้แหละครับ เสร็จแล้ว ง่ายจัง

settarget.png

เราได้ Target ใหม่แล้วสามารถ Config ได้ตามต้องการ คราวนี้เราจะสามารถใช้ source code เดียวกันแต่กำหนดการทำงานให้ต่างกันตาม target ได้หรือไม่ เพราะไม่งั้นการสร้าง target ก็ไม่มีประโยชน์อะไรเท่าไหร่ เพราะต้องเขียน class มากกว่ารอบเดียวขึ้นไปอยู่ดี ? คำตอบคือ “ได้ครับ” วิธีการที่ผมใช้ก็คือ “การตั้ง Tag ให้ Target แล้วเขียน source code กำหนดไปแต่ละ target โดยดูค่าจาก tag นั่นแหละ” (งงมั้ยเนี่ย)

ขั้นตอนก็คือ ไปตั้ง Tag ให้ Target โดยการ Double click ที่ target ที่ต้องการตั้ง tag (ขอเรียกแบบนี้แล้วกัน) ไปที่ Tab build แล้ว search Setting ว่า Other C Flags (อยู่ใน GCC 4.2 Language ครับ) ตั้งค่าเป็น “-DTARGET_NAME=1” ค่าหลังเครื่องหมาย = ก็แล้วแต่จะตั้งนะครับ

targetname.png

จากนั้นในส่วนของ Source code ที่ต้องการให้มีความแตกต่างในแต่ละ Target ก็จะใช้คำสั่ง #if เข้ามาช่วยครับ คำสั่งนี้จะเป็น if ในระดับของการ build เท่านั้น ไม่เกี่ยวกับ application logic ครับ ตัวอย่างการโค้ดก็เป็นแบบนี้

// Implement for each target

#if TARGET_NAME == 1
[aButton setHidden:NO];
[bButton setHidden:NO];
#elif TARGET_NAME == 2
[aButton setHidden:YES];
[bButton setHidden:NO];
#else
[aButton setHidden:YES];
[bButton setHidden:YES];
#endif

จากโค้ดตัวอย่างเป็นการ implement ง่ายๆนะครับ แค่ทำให้ดูว่า คำสั่ง #if, #elif, #endif รูปแบบเป็นไงบ้าง น่าจะพอเห็นภาพนะครับ

สำหรับ Entry นี้ก็คงจะพอแค่นี้นะครับ Entry หลังๆเกี่ยวกับ Target และ iPad ไว้ได้ลองของจริงแล้วจะเอามาแชร์ให้กันอีกนะครับ ตอนนี้ก็ happy coding สวัสดีครับ ;)

เมษายน 10, 2010 at 4:57 pm ใส่ความเห็น

How to send email from my iPhone app?

ในการพัฒนา iPhone app ถ้าเราต้องการจะส่ง email ด้วย Application ของเรา เราจะสามารถทำได้อย่างไร?

หลายๆคน (เช่นผม) คงคิดว่า “เรียก protocol mail:// เพื่อเปิดโปรแกรม mail.app  ของ iPhone ขึ้นมา” หรือไม่ก็ “generate html ที่เป็น tag mailto ขึ้นมา แล้วใช้่ openUrl ของ appDelegate เรียกเอา” ซึ่งผมเองก็ไม่เคยทดสอบวิธีพวกนี้(แต่คิดว่าน่าจะทำได้) แต่ถึงอย่างนั้นก็มีข้อเสียอย่างรุนแรงทั้งสองวิธี

วิธีเรียก protocol mail:// แอพเราจะถูกปิดตัวลง ส่วนวิธี mailto: ก็ยุ่งยากในการ attach ไฟล์ เช่นการแนบรูปภาพ ต้องแปลง UIImage เป็น NSData ที่ Encode ด้วย Base64 เพื่อที่จะได้ URI Scheme มา attach เป็น body (และผมก็ลองแล้วด้วย springboard crash ไปเลยละครับ)

อันที่จริง มันไม่ได้ยุ่งยากอะไรเลย เพราะ framework มันมีมาให้แล้วหล่ะครับ ชื่อว่า MessageUI.framework ครับ วิธีการ Add ก็ double click ที่ Project Target ของเรา ใน Tab general กด + ข้างล่างใน general link library เลือก MessageUI.framework กด Add แค่นี้ก็เสร็จแล้ว ง่ายซะไม่มี

ลองกดดูที่ Framework จะพบว่า “มี Class ให้ใช้แค่คลาสเดียวเอง คือ MFMailComposeViewController แค่ชื่อคลาสก็บอกแล้วว่าไม่ต้องการอะไรไปมากกว่านี้แล้ว

การใช้งาน ขั้นแรก ให้ import framework ลงไปในคลาสที่เราต้องการใช้งาน framework นี้ แนะนำให้ import ลงในไฟล์ header เลย (.h) เพราะเราจะต้องใช้ protocol ของ framework นี้ด้วย

// myVC.h

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>

@interface myVC : UIViewController <MFMailComposeViewControllerDelegate> {}

– (IBAction)sendMail:(id)sender;

ในตัวอย่าง Class myVC ของผม ให้มี Action ไว้ปุ่มนึงเพื่อรับ action touch เพื่อส่งเมล์ สังเกตว่าผม Import protocol MFMailComposeViewControllerDelegate ไว้ด้วยนะครับ เอาไว้ทำอะไร เดี๋ยวมาดูกัน ต่อไปเราจะมา Implement method sendMail: กัน

// myVC.m


– (IBAction)sendMail:(id)sender {
MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init];
mail.mailComposeDelegate = self;

[mail setSubject:@”Hello, Developer”];
[self presentModalViewController:mail animated:YES];
}
การ Implement ก็เท่าที่เห็นครับ เนื่องจาก MFMailComposeViewController Subclass มาจาก UIViewController เพราะฉะนั้น เราจึงสามารถใช้คำสั่งแสดงผลแยกออกมาจาก NavigationController อย่างคำสั่ง presentModalViewController:animated: ก็ได้ หรือจะ push ลงใน Navigation Controller ก็ได้อีกเช่นกัน ในส่วนของค่าเริ่มต้น จะใส่หรือไม่ใส่อะไรก็ได้ อย่างในตัวอย่าง ทำการตั้ง Subject เอาไว้ว่า Hello, Developer ซึ่งส่วนอื่นๆก็เพิ่มได้หมด ตั้งแต่ ผู้ส่ง, ผู้รับ , CC, BCC หรือแม้แต่แนบไฟล์ก็ยังทำได้ จะซึ่งการแนบไฟล์ทำได้ดังนี้


[mail setSubject:@”Hello, Developer”];
[mail addAttachmentData:imageData mimeType:@”image/png” fileName:imagePath];
[self presentModalViewController:mail animated:YES];

นี่ครับ เพิ่มบรรทัดต่อบรรทัด imageData นี่เป็นไฟล์ NSData นะครับ ไม่ใช่ UIImage ถ้าไม่รู้ว่าแปลงยังไงก็ใช้คำสั่ง UIImagePNGRepresentation(<#your uiimage#>) หรือ UIImageJPGRepresentation(<#your uiimage#>) ก็ได้ครับ ขึ้นกับว่าต้นฉบับเป็นนามสกุลอะไร แต่ถ้าเป็นไฟล์อื่นก็หาวิธีแปลงเอาเองนะครับ บอกหมดคงไม่ไหว (ฮา) ส่วน mimeType ถ้าไม่รู้ Type ไหนต้องตั้งเป็นอะไร ลองดูที่นี่ครับ http://www.sfsu.edu/training/mimetype.htm มีบอกให้น่าจะเพียงพอ

ต่อไปก็เรื่องที่ค้างกันไว้ Protocol ที่ import ไว้ตั้งแต่ Header จะเห็นตอนเรา allocate ด้วยว่าเรามีการ set delegate มาที่ตัวเอง ซึ่ง method ที่เราใช้เรียกผ่าน delegate ก็คือ mailComposeController:didFinishWithResult:error: แปลง่ายๆก็คือ “ส่งเสร็จแล้วทำอะไร” จาก Parameter จะเห็นว่าจะ return ผลการส่งมาให้ทั้งหมด ส่งเสร็จหรือเปล่า ถ้าไม่เสร็จแล้ว Error ยังไง หน้าที่ของเราก็คือ “กำหนดว่า หลังจากส่งแล้วจะทำอะไรต่อ” ซึ่งผมจะไม่ทำอะไร นอกจาก “ส่งเสร็จแล้วก็ปิดหน้าส่ง email ไปซะ ทำได้ดังนี้

– (void)mailComposeController:(MFMailComposeViewController*)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError*)error
{
[controller dismissModalViewControllerAnimated:YES];
}

…เท่านี้ละครับ เสร็จแล้ว ง่ายอย่างไม่น่าเชื่อ สำหรับ Entry นี้ก็จบแค่นี้ละครับ มีอะไรเจ๋งๆง่ายๆ จะมาเขียนแนะนำกันอีก

Happy Coding ครับ

มีนาคม 23, 2010 at 3:26 pm 2 ของความคิดเห็น

Cocoa & iPhone Development : MVC Design Pattern

มาว่ากันด้วยเรื่องแรกที่เราต้องรู้จากที่กล่าวไว้ข้างต้นนะครับ(ถ้าไม่นับว่าต้องมีเครื่องแมค อันนั้นมีตังซื้อก็พอแล้ว อิอิ) เรื่องเกี่ยวกับ MVC (Model-View-Controller) Design Pattern นั่นเอง

อันที่จริง เกี่ยวกับ MVC นี้ หาอ่านได้ไม่ยากในอินเตอร์เนต ทั้งภาษาอังกฤษและภาษาไทย ซึ่งหลายๆที่ก็อธิบาย MVC ในเทอมต่างๆภาษาและเฟรมเวิร์คกันไป เช่น MVC บน PHPCake(PHP)  หรือ MVC บน Ruby on Rails(Ruby)  ในที่นี้ ผมเองก็จะขออธิบายในเทอมของ Cocoa ละกันนะครับ

เริ่มเลยแล้วกัน…

MVC Design Pattern คือ Design Pattern ในระดับ Architecture แบบนึง ที่ได้รับความนิยมในการ Design Application ขนาดใหญ่ในปัจจุบัน ตัว MVC ในชื่อของมัน ย่อมาจากคำว่า Model-View-Controller ซึ่งก็ตรงตัวกับลักษณะของมันนั่นเอง ซึ่งก็คือ “การแบ่งองค์ประกอบของ Application ออกเป็นสามส่วนแยกออกจากกัน” ซึ่งแต่ละส่วนจะทำงานเชื่อนโยงกันในลักษณะดังภาพ

Cocoa MVC - ภาพจาก Apple.com

Cocoa MVC - ภาพจาก Apple.com

แนวคิดของ Design Pattern จากภาพจะเห็นว่า แอพพลิเคชั่นแบ่งออกเป็น 3 ส่วน คือ View และ Model เชื่อมต่อกันผ่าน Controller แล้วแต่ละส่วนมันเป็นยังไงไงบ้างหล่ะ ?

Model คือ ส่วนของข้อมูล ตัวอย่างเช่น Database หรือ Datasource ของตารางใน Application เป็นต้น Model อาจรวมถึง State ของ Application ได้ด้วยเช่นกัน เช่น Preference Setting ของโปรแกรมก็ได้ ไม่ได้จะหมายถึง Information อย่างเดียวเท่านั้น ซึ่งตัว Model เองก็จะต้องมี Model Logic อยู่ด้วย ซึ่งก็หมายถึง เงื่อนไขการเข้าถึงหรือการเก็บข้อมูล จะเก็บอย่างไร ชนิดไหน อย่างไร ฯลฯ  (ในส่วนของ Model Logic จะเห็นชัดเมื่อเรารู้จัก Property List ใน Objective-C 2.0 ที่จะพูดถึงในภายหลังนะครับ ตอนนี้ Push Stack ไว้ก่อนนะครับ) หน้าที่ของ Model ไม่มีอะไรไปมากกว่า “การเก็บข้อมูล” และ “การส่งข้อมูล” เท่านี้จริงๆครับ ไม่มีมากไปกว่านี้ อย่าสับสนกับ Model Logic นะครับ

View คือ ส่วนของการแสดงผล เช่นกันครับ หน้าที่ของ View ไม่มีไปมากไปกว่า “การแสดงผล” และ “การรอรับคำสั่ง” View ที่เห็นๆกันก็คือ GUIs นั่นแหละครับ ภายใน View ก็เหมือนกับ Model ครับ ต้องมี View Logic เช่นกัน View Logic ก็คือข้อกำหนดของการแสดงผลครับ หน้าต่างกว้าง-ยาว แค่ไหน ปุ่มเป็นสไตล์ไหน ตัวอักษรสีอะไร ฯลฯ นีแหละครับ View Logic น่าจะพอเห็นภาพนะครับ

Controller ส่วนนี้เป็นส่วนที่เชื่อมการทำงานระหว่าง Model กับ View จะพูดให้ง่ายกว่านั้นก็คือ มันคือ “User Logic หรือ Action Logic” ครับ เพราะมันเป็นส่วนควบคุมการทำงานของ User ที่ทำต่อ Application นั่นเอง ว่า User ทำอะไรได้บ้าง แล้ว Application ต้องทำอะไรบ้างเมื่อได้รับ Action นั่นมาแล้ว นั่นคือหน้าที่ของ Controller ครับ

ใน Cocoa Framework ยังมี Object อีกประเภทนึง เรียกว่า “Hybrid Model” ซึ่งหมายถึง Model ที่รวม Model กับ Controller เข้าไว้ด้วยกัน เพราะบางครั้งการแยกกันแบบ MVC อาจไม่ได้เหมาะสมกับ Application ทุกแบบ(รวมกันอาจจะดีกว่า ง่ายกว่า เร็วกว่า) ตัวอย่างของ Hybrid Model ใน Cocoa ก็เช่น Array Controller เป็นต้น และใน iPhone App Dev ก็เช่น Image Picker เป็นต้น(นอกจากนี้ยังมีอีกเยอะ แต่ยังไม่ได้ลอง) ซึ่งก็จะได้รู้จักกันภายหลังนะครับ (Push Stack ไว้อีกอันแล้วกันนะครับ)

ในส่วนของ MVC ก็ขอจบไว้เท่านี้นะครับ สามารถศึกษาเรื่องของ MVC ได้จากที่อื่นด้วยนะครับ บางที่อาจจะเขียนดีกว่าผมซะอีก เห็นว่ายังไงก็แนะนำกันได้นะครับ แล้วเจอกันใน Entry ถัดไปนะครับ (กะว่าจะอธิบายสั้นๆนะ ทำไมมันยาวไปซะได้ละเนี่ย เหอๆ)


Let’s talk about first thing, which you must know before start to iPhone application development, It’s MVC Design Pattern

In fact, You can find an article about MVC very easy from internet. Thai and English both. Each articles will explain about MVC in term of any language and framework such as MVC on PHPCake(PHP) or MVC on Ruby on Rails(Rails). So, I’ll explaining MVC in term of Cocoa Framework .

Let’s start

MVC Design Pattern is one Design Pattern in “Architecture Level” which popular in “Large scale application design” in this time. MVC is stand for Model-View-Controller which explain self structure from name is “Separate an element of application to 3 parts”. Each part is work together like in illustrate.

Cocoa MVC - ภาพจาก Apple.com

Cocoa MVC - ภาพจาก Apple.com

From the illustrate, you see Application separate in 3 parts is “View” and “Model” is connected by controller. How its work?

Model is data storage part. Such as Database or Data source in table in application. Model part is can be include state of application like preference setting not only “Information”.Model must have a “Model logic” inside. Model logic is a “Condition for storage”, how to storage?, which type and etc (we’ll talk about this again in “Property list in Objective-C 2.0 entry). A load of Model is not more than “storage” and “retrieve” a data. Not more than that.

View is a show result part. Same as “Model” a load of View is not more than “Show result” and “Wait for action”. A well-known View is GUIs. Inside View must have “View Logic” like Model too. Model Logic is an attribute for display such as Dimension (height-width), button style, font color and etc.

Controller is a connection part with “Model” and “View”. Say an easier is a “User Logic” or “Action Logic”. Because its controlled an action of user to do on application. What user can do ?. When got an action, What should application do ? , This is Controller load.

In Cocoa Framework still has one object type called “Hybrid Model”. Its a Model which have controller integrated. Because maybe a separate in 3 part like MVC is not good solution for all. For example for “Hybrid model” on Cocoa such as “Array Controller” and in iPhone App Dev is such as “Image Picker”. We’ll say again in later.

I finished entry about MVC only this. You can read MVC article from other place (somewhere can explain better than me). See you again in next Entry.

มกราคม 24, 2009 at 4:28 pm 4 ของความคิดเห็น

CS193P : iPhone Application Development

ช่วงนี้กำลังง่วนๆอยู่กับการหัดเขียน Application บน iPhone ครับ แรกๆคิดว่าไม่น่าจะแตกต่างอะไรกับการพัฒนา Application บน Mac แต่เอาเข้าจริง ก็ไม่หมูอย่างที่คิด เพราะไม่เหมือนกับ Cocoa ซะทีเดียว มีรายละเอียดต่างๆที่ต้องเก็บเพิ่มเติมมากขึ้น โดยเฉพาะการจัดการ Memory ที่ต้องทำให้มีประสิทธิภาพและต้องจัดการด้วยตัวเอง ทั้งที่เขียนด้วย ObjC 2.0 แต่บน iPhone ก็หมดสิทธิ์ใช้ GC (Garbage Collector) อยู่ดี และยังมีส่วนอื่นๆที่ยังไม่ขอพูดถึงในที่นี่

หลังจากที่ Apple ยกเลิกสัญญา NDA (สัญญาเกี่ยวกับการเผยแพร่ข้อมูลการพัฒนา Application บน iPhone) หนังสือ บทความต่างๆก็เริ่มผุดออกมาเป็นดอกเห็ด ซึ่งก็นับว่าเป็นเรื่องดีของ Developer อย่างเราๆ ซึ่งก็นับรวมถึง  Course IPhone Application Development ของ มหาวิทยาลัย Stanford ด้วย

หลังจากที่ผมรู้ข่าวเรื่องที่ Stanford ปล่อย Lecture รายวิชานี้ออกมาให้ดูกันได้แล้ว ผมก็แทบจะเข้าไปดูทันที และพบว่า “มันน่าสนใจมากๆ” Course นี้เหมาะสำหรับผู้ต้องการเริ่มต้นพัฒนา Application บน iPhone จริงๆครับ เพราะเริ่มสอนตั้งแต่คอนเซปต์เริ่มต้น เช่น OOP และ Design Pattern แต่ก็บอกตามตรงว่า “สำหรับคนที่ไม่มีพื้นฐานเกี่ยวกับ ObjC หรือ Cocoa กว่าจะได้ Assignment นึงคงจะเหนื่อยพอดูเลย เพราะยากเอาเรื่อง” แต่ก็ถือว่าเป็นจุดที่ดีสำหรับการเริ่มต้น แนะนำครับ

ตอนนี้ผมอ่านไปได้ 5 Lecture แล้ว และได้เพิ่มเติมความรู้ต่างๆขึ้นเยอะเลย ไม่เฉพาะ iPhone app dev แต่รวมไปถึง Cocoa ด้วย ถือเป็นการเติมพื้นฐานให้แน่นยิ่งขึ้นไปด้วยครับ สำหรับผู้สนใจ ลองเข้าไปดูกันได้นะครับ CS193P : iPhone Application Development

อ่านแล้วก็รู้สึกว่าการศึกษาของเขามันไม่เหมือนของไทยเราเลยนะ ของเขาเน้นให้เด็กศึกษาและลองทำล่วงหน้าของคาบถัดไป แล้วคาบถัดไปก็ค่อยมาดูกันว่าทำถูกผิดยังไง ก็ว่ากันไป ไม่เหมือนกับไทย ที่เน้นทบทวนที่เคยสอนเคยพูดไปแล้วในคาบ แล้วก็เน้นโค้ดเน้นการอินพลีเมนต์เป็นเคสๆไป ลองศึกษาแบบต่างประเทศบ้างก็ได้ประโยชน์อยู่ไม่น้อยนะเนี่ย

พฤศจิกายน 16, 2008 at 7:57 am 3 ของความคิดเห็น

Cocoa : 3 สิ่งที่เจ๋งซะเหลือเกินสำหรับ Obj-C 2.0

ไม่ได้มาอัพซะนาน เนื่องจากติดงานนั่นแหละ แต่จะว่าไปก็เพราะไม่มีงานเลยไ่ม่มีอะไรจะเขียนไปพักใหญ่ๆเลย(ตอนนี้มีแล้ว เยอะด้วย) ก็คิดซะว่าไปหาแรงบันดาลใจมาเขียนละกัน จากนี้ยังมีอีกงานแต่ว่าก็ยังมีอะไรให้เขียนอีกยาวๆแหละ

…เข้าเรื่องเลยดีกว่า 

ไม่ได้เขียนซะนานมากเกี่ยวกับเรื่อง Cocoa Programming ก็ไม่รู้เหมือนกันว่าคนที่เข้ามาอ่าน Blog ผมเนี่ย จะมีคนที่เป็น Developer บน เครื่อง Macintosh รึเปล่า แต่ค่อนข้างมั่นใจว่าแต่ละ entry ที่เขียนเนี่ย ไม่ค่อยมีแบบเป็นภาษาไทยแน่นอน ไม่เชื่อก็ต้องเชื่อ เพราะ Search เจอบน Google เป็นเวบแรกบ่อยมาก

…เข้าเรื่องเลยดีกว่า(จริงๆ)

เรื่องที่อยากจะเขียนวันนี้เป็นเรื่องเกี่ยวกับ Objective-C 2.0 ที่ออกมาพร้อมๆกับ Mac OSX Leopard 10.5 และ iPhone SDK (ออกมาช่วงๆนั้น ผมจำเวลาแน่นอนไม่ได้) ซึ่งสำหรับส่วนของ Objective-C 2.0 มี Feature ใหม่ๆเด่นๆเลยอยู่ 3 ตัวนั่นเอง

ตัวแรก GC (Garbage Collector) – แปรตรงตัวว่าพนักงานช่วยเก็บขยะ ช่วยจัดการตัวแปรต่างๆที่เคยถูกเรียกใช้ในโปรแกรมแล้วไม่มีการคืน Memory ให้กับระบบ ซึ่งเป็นการสิ้นเปลืองทรัพยากรนั่นเอง ซึ่งกับงานชิ้นใหม่นี้ได้ลองใช้แล้ว เวิร์คมากๆ ผมไม่ต้องนั่งจัดการ Memory เองเลย สบายขึ้นเยอะ(แต่ก็ทำให้เขียนโค้ดชุ่ยขึ้นเช่นกัน เพราะไม่ต้องมาซีเรียสเรื่องการคืน Memory อีกแล้ว)

…แต่พอใช้ไปซักพักก็เกิดปัญหา เพราะ ID3.framework ไม่รองรับการใช้งาน GC จบครับงานนี้ จัดการ Memory เองตามเคย วิธีการใช้งานไม่ยาก เข้าไปเซตในส่วนของ Project Info (คลิกขวาตรงชื่อโปรเจคของเราที่อยู่บน List ด้านบนสุด แล้วเลือก Get Info) จากนั้นเลือก Tab Build ในช่อง Search in Build พิมพ์เลยว่า “Garbage Collector” จากนั้นเลือกเป็น Supported ก็เป็นอันเรียบร้อยครับ


* สรุปแล้ว GC มีประโยชน์แน่ ถ้าไม่ใช้กับ Framework ตัวเก่าๆบางตัว หรือ Application บางตัวที่เกี่ยวกับ Graphics วัดดวงเอาแล้วกันนะครับ 

อย่างที่สอง การกำหนด Property ให้กับ Attribute อาจคิดว่าไม่จำเป็น แต่เอาจริงๆแล้วก็มีประโยชน์โขอยู่ อันที่จริงก็คือการกำหนดว่า Attribute แต่ละตัวจะจัดการข้อมูลอย่างไร(วิธีการจองพื้นที่, การ Access Attribute) การทำแบบนี้ได้ประโยชน์หลายอย่าง เช่น ช่วย generate ฟังก์ชั่นสำหรับการเข้าถึง attribute (set, get function) ช่วยเราประหยัดการเขียนโค้ดไปได้เยอะ อีกทั้งยังเป็นตัวช่วย  GC ตรวจสอบอีกด้วยว่าเป็นขยะหรือไม่ (อันน้ีไม่แน่ใจว่าเกี่ยวรึเปล่า แต่เท่าที่เจอก็เขียนว่าอย่างนั้น)

การ Access Attribute สามารถ Access ได้โดยใช้ Syntax “.” ได้ด้วย ก็ดูสะดวกดีไปอีกแบบนึง ถึงแม้ว่าตอนแรกๆผมจะใช้แล้วรู้สึกว่ามันทำให้ Syntax แบบ “[]” Obj-C มันไม่สวยเท่าไหร่ แต่ใช้ไปซักพักมันก็ง่ายแล้วก็เข้ากับ MVC ดีเหมือนกัน

อย่างที่สาม ชอบสุดๆกับ Fast Enumerator  ไม่มีอะไรมากครับ เหมือนๆกับการวน for ภายใน array ในภาษา OO แบบใหม่ๆอย่าง Ruby หรือ Python ลักษณะ Syntax ของมันก็คือ

for ( id element in myArray )
{ // do something on each element }

Syntax ดูดีขึ้นเยอะเลย ดูเป็นภาษาที่ High Level ขึ้นอีกหน่อย ชอบที่สุดก็อันนี้แหละ ทำงานกับ Array สบายขึ้นเยอะ

คราวนี้ยังไม่ขอลงลึกกับแต่ละอันนะครับ  ขอนึกคำอธิบายเคลียร์ๆกว่านี้หน่อยแล้วจะมาเขียนอีกทีดีกว่า

สิงหาคม 28, 2008 at 6:09 pm ใส่ความเห็น


del.icio.us For iPhone dev

Post Calendar

สิงหาคม 2019
พฤ อา
« ธ.ค.    
 1234
567891011
12131415161718
19202122232425
262728293031