Objective-C Programming Chapter 11 (Part2)

NSString Path Category

คลาส NSString ที่เราคุ้นเคยนั้นมีแคทิกกอรี่เกี่ยวกับ path ชื่อว่า NSPathUtility ฟังก์ชั่นบางตัวเราที่เราได้เรียกใช้จากโปรแกรมทีผ่านๆมาก็เป็นส่วนหนึ่งของแคทิกกอรี่นี้เช่น NSHomeDirectory เป็นต้น ยังมีแคทิกกอรี่หลายตัวที่น่าสนใจดังโปรแกรมตัวอย่างต่อไปนี้
Program 11.4
Main.m

Program 11.4 Output

Temporary Directory: /var/folders/_f/xp9j55592s97kgl19kf9p8w40000gp/T/
Current: /Users/Ter
Last path: Ter
Fullpath: /Users/Ter/test.txt
Extension: txt
/
Users
Ter

NSData

คลาส NSData นี้เป็นคลาสที่ใช้ในการจองและจัดการกับ Buffer โดยตรงหรือเรียกว่า Byte Buffer คลาส NSData นี้ก็มีคลาสคู่แฝดเช่นเดียวกันกับคลาส Foundation อื่นๆคือคลาสมีทั้งแบบ mutable และ immutable ตัวอย่างโปรแกรมที่ผ่านมาเราใช้่คลาส NSFileManager ในการจัดการไฟล์และโฟลเดอร์ เช่นการ คัดลอก แต่ยังไม่ได้ใช้เมธอดทีเกี่ยวกับการอ่านข้อมูล และการข้อมูลลงไฟล์ โปรแกรมที่เราจะเขียนกันต่อไปนี้เราจะใช้คลาส NSData ร่วมกับ NSFileManager อ่านและเขียนข้อมูล

Program 11.5
Main.m

โปรแกรมเริ่มจากการเปลี่ยน path ไปทำงานที่ desktop ของผู้ใช้งาน จากนั้นเราก็เตรียมข้อมูลที่จะใช้ในการเขียน

คลาส NSString มีเมธอด dataUsingEncoding:  ที่ช่วยในการแปลงข้อมูลเป็น NSData และเราต้องกำหนด encode ของข้อมูลที่ต้องการ โปรแกรมตัวอย่างกำหนดให้เป็น unicode (encode อื่นๆเช่น utf8 , ascii ดูการใช้ได้ใน Document ) หลังจากนั้นเราก็ให้ File Manager ของเราเขียนข้อมูลดังกล่าวลงไฟล์ เมื่อเสร็จเรียบร้อยเพื่อความแน่ใจว่าข้อมูลถูกต้อง เราก็อ่านข้อมูลจากไฟล์ที่เพิ่งได้เขียนไปและแสดงผลทาง console

Program 11.5 Output

Create a new file successed
Xcode is the integrated development environment (IDE) designed for developing iOS and Mac apps. The Xcode IDE includes editors used to design and implement your app, such as a source code editor and a user interface editor.

อย่างไรก็ตามเราไม่จำเป็นต้องใช้คลาส NSFileManger เพื่ออ่านข้อมูลก็ได้ เพราะคลาส NSData นั้นมีเมธอดในการอ่านและเขียนข้อมูลอยู่แล้ว เช่นโค้ดตัวอย่างดังนี้

NSFileHandle

คลาส NSFileHandle ถูกแบบมาเพื่อให้ห่อฟังก์ชั่นที่เรียกใช้งานของ file descriptor เพื่อช่วยอำนวยความสะดวกมากขึ้น หรือเรียกว่า wrapper class นั่นเอง NSFileHandle จะเน้นหนักไปทางการใช้งานกับไฟล์และข้อมูลโดยตรง เช่น การหาตำแหน่งของข้อมูลในไฟล์ที่ต้องการ ซึ่งจะต่าง NSFileManager ที่จะเน้นการจัดการไฟล์
การใช้งาน NSFIleHandle จะมีขั้นตอนหลักๆด้วยกัน 3 ขั้นตอนคือ เปิดไฟล์ที่ต้องการ จากนั้นก็เริ่มทำงานกับไฟล์ที่ถูกเปิดขึ้นมา และหลังจากใช้งานเสร็จเรียบร้อยก็ปิดไฟล์ เราจะเขียนโปรแกรมขึ้นมาทดลองใช้งาน NSFileHandle โดยโปรแกรมที่เราจะสร้างขึ้นมาใหม่นี้จะอ่านข้อความจากไฟล์ read.txt ซึ่งมีข้อความ Xcode is the integrated development environment และนำข้อความนี้มาต่อท้ายไฟล์ write.txt ซึ่งมีข้อความ Hello อยู่ก่อนหน้าแล้ว

Program 11.6
Main.m

เริ่มด้วยการประกาศออบเจ็กต์ NSFileHandle สองตัวคือ fileReader เพื่ออ่านข้อมูลในไฟล์ read.txt และ fileWrite เพื่อเขียนไปยังไฟล์ write.txt เมธอดที่ใช้ในการเปิดไฟล์เพื่ออ่านข้อมูลคือ fileHandleForReadingAtPath: เมธอดนี้จะเปิดไฟล์เพื่ออ่านข้อมูลอย่างเดียว ส่วนอีกเมธอดที่ทำหน้าเขียนไฟล์ก็จะทำหน้าที่แค่เขียนอย่างเดียวเท่านั้นไม่สามารถใช้อ่านข้อมูลได้ และเพื่อให้แน่ใจว่าสามารถใช้ไฟล์ทั้งสองได้จึงเขียนเงื่อนไขตรวจสอบก่อน เมื่อผ่านขั้นตอนนี้ไป เราจะต้องการจะเขียนข้อมูลต่อท้ายไฟล์ ดังนั้นจึงต้องเรียกเมธอด seekToEndOfFile เพื่อขยับตำแหน่งที่ใช้ในการเขียนไฟล์ไปยังท้ายสุดของไฟล์ จากนั้นเริ่มเข้าสู่ loop การอ่านและเขียนไฟล์

เมธอด readDataOfLength จะอ่านข้อมูลด้วยทีละ 128 Bytes และเก็บไว้ที่ buffer หลังจากนั้น fileWrite ก็จะเขียนข้อมูลที่ได้ไปยังไฟล์ โปรแกรมจะทำงานไปเรื่อยๆจนกว่า fileReader จะอ่านข้อมูลไปจนถึงส่วนสุดท้ายของไฟล์หรือไม่มีข้อมูลให้อ่านต่อ หลังจากเสร็จสิ้นการอ่านและเขียนข้อมูลแล้ว เราก็ต้องทำการปิดไฟล์ทั้งสอง ด้วยการเรียกเมธอด closeFile นั่นเอง โปรแกรมก็จะแสดงผลดังนี้

Program 11.6 Output

Content of file(R):
Xcode is the integrated development environment (IDE)

Content of file(W):
Hello Xcode is the integrated development environment (IDE)

โปรแกรมที่ได้เขียนไปเราอาจจะเขียนส่วนของการอ่านข้อมูลให้้โดยไม่ต้องใช้ลูปก็ได้ดังเช่นโค้ดต่อไปนี้

คลาส NSFileHandle มีหน้าที่หลักคือใช้จัดการข้อมูลในไฟล์ ดังนั้นแล้วจึงไม่มีเมธอดที่ใช้ในจัดการไฟล์ เช่น การสร้างไฟล์ ดังนั้นเราต้องใช้คลาส NSFileManager เพื่อใช้ในการทำหน้าที่จัดการไฟล์

NSBundle

ปกติแล้วเมื่อเราเขียนโปรแกรมขึ้นมา ระบบจะทำการรวบรวมสิ่งที่โปรแกรมจำเป็นต้องใช้ อาทิเช่น รูปภาพ หรือ library ต่างๆ  เข้าไว้ด้วยกันและเรียกว่า Applicaiton Bundle คลาส NSBundle ได้ใช้เป็นประจำเมื่อต้องเขียนโปรแกรมแบบที่ไม่ใช่ Console เช่น iOS Applicaiton หรือ Mac OS X Application คลาสนี้มีเมธอดที่สำคัญอยู่หลายเมธอด อาทิเช่น เมธอดที่บอกว่าโปรแกรมของเราทำงานที่ path ใด หรือเมธอดช่วยในการหา resource path ของโปรแกรม เป็นต้น
เราจะเขียนโปรแกรมเพื่อหาว่าโปรแกรมที่ของเรานั้นทำงานอยู่ที่ใด และทำงานบนเครื่อง 64 bit หรือ 32 bit โดยโปรแกรมมีโค้ดง่ายๆดังต่อไปนี้

Program 11.7
Main.m

Program 11.7 Output
/Program_11.7-/Build/Products/Debug/Program 11.7
64-Bit Intel
{
CFBundleExecutablePath = “/Program_11.7-/Build/Products/Debug/Program 11.7”;
NSBundleInitialPath = “/Program_11.7-/Build/Products/Debug”;
NSBundleResolvedPath = “/Program_11.7-/Build/Products/Debug”;
}

 

NSURL

โปรแกรมที่ผ่านมาถ้าสังเกตจะเห็นว่าเมื่อเราอ้างอิงที่อยู่ของไฟล์ต่างๆเรามักจะใช้ NSString ในการอ้างอิงเสมอ แต่ในบางครั้งการใช้ NSString อ้างอิงที่อยู่ไฟล์อาจจะไม่ครอบคลุมนัก เช่น ไฟล์ที่อยู่บนอินเทอร์เน็ต เป็นต้น ใน Foundation Framework นี้มีคลาส NSURL เพื่อช่วยอำนวยความสะดวกให้เราในอ้างอิงไฟล์  เราจะเขียนโปรแกรมง่ายๆเพื่อใช้อ่านข้อมูลที่อยู่บนอินเทอร์เน็ต และแสดงผลทาง console

Program 11.8
Main.m

Program 11.8 Output
<?xml version=”1.0″ encoding=”UTF-8″?>
<rss version=”2.0″ xmlns:content=”http://purl.org/rss/1.0/modules/content/”

….

</rss>

เพียงโค้ดไม่กี่บรรทัดเท่านี้เราก็สามารถเชื่อมต่อกับ internet ได้แล้ว นอกจากนี้แล้วคลาสต่างๆของ Foundation Framework ยังมีเมธอดต่างๆที่รองรับ NSURL เช่นคลาส NSArray มีเมธอด arrayWithContentOfURL: เช่นตัวอย่างโปรแกรม 11.9

Program 11.9
Main.m

Program 11.9 Output
Dictionary:
{
    Apple = iPhone;
    Blackberry = Z10;
    Samsung = Galaxy;
}
Array:
(
    Banana,
    Mango,
    Orange
)
Array file:
(
    Dog,
    Cat,
    Lion
)

จากโปรแกรมง่ายๆจะเห็นได้ว่าคลาส NSURL นั้นสามารถกำหนด path ได้ทั้งไฟล์ที่อยู่บนเครื่องและอินเทอร์เน็ต อย่างไรก็ตามการเมธอดที่ช่วยดึงข้อมูลจาก internet ของ foundation class ที่ได้เขียนไปนั้น เป็นเพียงการใช้งาน Network อย่างง่ายเท่านั้น และในบทหลังๆเราจะเรียนรู้เกี่ยวกับคลาสที่เป็นเกี่ยวของกับระบบ Network โดยตรง

โหลด PDF : Chapter 11
Source code

 

3 thoughts on “Objective-C Programming Chapter 11 (Part2)”

  1. ขอบคุณมากครับสำหรับบทความดีๆ
    download PDF ไม่ได้น่ะครับ

Leave a Reply