วันนี้ผมต้องเขียนโปรแรกมโดยใช้ queue ผมก็พยายามหานะว่า มันใช้ class ไหน แต่หายังไงก็หาไม่เจอ สุดท้ายแล้วก็ค้นพบว่า ในภาษา objective-c นั้นมี class จำพวก container หลายตัวให้เลือกใช้ ตั้งแต่ array , dictionary , set แต่กลับไม่มี stack และ queue
ก็ในเมื่อมันไม่มีให้ใช้ แล้วคำถามต่อไปคือ เราต้องเขียน เองใหม่ทั้งหมดเลยหรือ ?
คำตอบคือไม่ครับ เราไม่ต้องไปเขียน class เหมือนกับ NSMutableArray , NSDictionary อะไรแบบนั้นเองทั้งหมด แต่สิ่งที่เราต้องทำก็คือ นำคุณสมบัติของภาษา objective-c มาใช้นั่นก็คือ class extend ครับ ถูกต้องแล้ว Categories !!!!
ถ้ายังไม่เคยใช้ หรือไม่รู้จักว่ามันคืออะไร ลองอ่าน http://www.macfeteria.com/2008/11/objective-c-programmming-extending-class/
Stack
stack เป็น container ชนิดหนึ่งที่มีลักษณะการทำงานคือ อะไรที่เข้าไปก่อน จะออกทีหลัง ก็เหมือนเอาหนังสือวางลงไปในกล่องทับกัน นั่นเหละครับ ถ้าอยากได้เล่มล่างสุดก็ต้องเอาเล่มบนสุดออกก่อน เอาละครับเรามาดู code กันเลยดีกว่าว่าเราเขียนมันได้ยังไง
// ------- Interface ------------------------- @interface NSMutableArray (QueueAdditions) - (id) dequeue; - (void) enqueue:(id)obj; @end // ------- Implement ------------------------- @implementation NSMutableArray (QueueAdditions) // Queues are first-in-first-out, so we remove objects from the head - (id) dequeue { // if ([self count] == 0) return nil; // to avoid raising exception (Quinn) id headObject = [self objectAtIndex:0]; if (headObject != nil) { [[headObject retain] autorelease]; // so it isn't dealloc'ed on remove [self removeObjectAtIndex:0]; } return headObject; } // Add to the tail of the queue (no one likes it when people cut in line!) - (void) enqueue:(id)anObject { [self addObject:anObject]; //this method automatically adds to the end of the array } @end
Queue
queue ก็ไม่ต้องอธิบายอะไรมากครับ คือเรียงตามลำดับก่อนหลัง
// ------- Interface ------------------------- @interface NSMutableArray (StackAdditions) - (id)pop; - (void)push:(id)obj; @end // ------- Implement ------------------------- @implementation NSMutableArray (StackAdditions) - (id)pop { // nil if [self count] == 0 id lastObject = [[[self lastObject] retain] autorelease]; if (lastObject) [self removeLastObject]; return lastObject; } - (void)push:(id)obj { [self addObject: obj]; } @end
จะเห็นได้ว่า เราสามารถใช้ categories เข้ามาช่วยเพิ่มความสามารถของ NSMutableArray ได้ง่ายๆมาก และเราก็ไม่ต้องไปเขียน stack หรือ queue เอง



besttermc says:
ขอนอกเรื่องนิสนึงนะครับ
ถ้าอยากเขียน socket programming
แต่มีmacเครื่องเดียว จะทดสอบยังไงดีครับ
แล้ว ใช้ CFNetwork เขียนเอาหรอครับ
April 20, 2010, 1:12 pmพอมีข้อแนะนำไหมคับ
admin says:
iPhone หรือว่า Mac App อะครับ
คือถ้าเป็น Mac App เนี่ยเราจะใช้ CFNetwork ก็ได้ครับถ้าหากว่าเขียนโปรแกรมด้วย Carbon
แต่ถ้าใช้ภาษา objective-c อยู่แล้ว cocoa มี framework พวก network ให้ใช้ครับ
เครื่องเดียวจริงๆก็ทำได้นะครับ เราเขียน server , client บนเครื่องเดียวก็ได้
April 20, 2010, 2:54 pmแต่ว่าถ้าจะให้ดีต้องมีสองเครื่องครับ
besttermc says:
iPhone ครับ
อยากเขียน ให้ส่ง_รับกันให้ได้ก่อนครับ
เพราะตอนนี้ ยังเปิด connection ยังไม่ได้เลยครับ
April 20, 2010, 9:34 pmยัง set port กับ ip ยังไม่รุ้ว่าไปเซ็ตตรงไหนเลยครับ
besttermc says:
ตัวอย่างที่ส่งมาให้ มี echo server ที่ให้ระบุ port ใช่ป่ะครับ
April 20, 2010, 9:37 pmแล้วอีกตัวเอาไว้ใช้ทำอะไรอ่าครับ ที่ให้ print certificate อะไรซักอย่าง