การทำงานบางอย่างต้องใช้เวลานานกว่าจะเสร็จ เช่น การ download ไฟล์จากอินเทอร์เน็ต หรือการสร้าง object ของ NSString ด้วยคำสั่งอย่าง
และหากเราทำ operation ดังกล่าวบน main thread แล้ว ปัญหาที่มักพบก็คือ User Interface (UI) จะเกิดอาการ freeze ซึ่งนั่นอาจทำให้ผู้ใช้ (user) เกิดอาการหงุดหงิด และรู้สึกไม่ลื่นไหลอย่างที่ควรจะเป็นได้
วิธีการแก้ไขอย่างง่ายๆก็คือย้าย operation ที่เข้าข่ายว่าจะทำงานนานเกินไปออกไปทำงานนอก main thread และจัดการ thread นั้นด้วยตัวเอง หรืออีกวิธีหนึ่งก็คือใช้ NSOperationQueue ช่วย หลักการมีดังนี้
queue จะจัดการ และเรียกใช้ method loadDataWithOperation ให้เราเองหลังจากที่มันถูกใส่ลงไปใน queue แล้วอัตโนมัติ
เท่านี้ UI ก็จะไม่ freeze แล้ว และชีวิตเราก็สบายขึ้น
ตัวอย่าง code เปรียบเทียบปัญหาก่อนหลัง และข้อมูลเพิ่มเติม
Related Link from Roti
[NSString stringWithContentsOfURL: url]
และหากเราทำ operation ดังกล่าวบน main thread แล้ว ปัญหาที่มักพบก็คือ User Interface (UI) จะเกิดอาการ freeze ซึ่งนั่นอาจทำให้ผู้ใช้ (user) เกิดอาการหงุดหงิด และรู้สึกไม่ลื่นไหลอย่างที่ควรจะเป็นได้
วิธีการแก้ไขอย่างง่ายๆก็คือย้าย operation ที่เข้าข่ายว่าจะทำงานนานเกินไปออกไปทำงานนอก main thread และจัดการ thread นั้นด้วยตัวเอง หรืออีกวิธีหนึ่งก็คือใช้ NSOperationQueue ช่วย หลักการมีดังนี้
- สร้าง queue ซึ่งเป็น object ของ NSOperationQueue
- สร้าง operation ซึ่งเป็น object ของ NSOperation
- เอา object ที่สร้างในข้อ 2 ใส่ลงไปใน queue (ที่สร้างในข้อ 1 )
- release operation ทิ้ง
NSOperationQueue *queue = [NSOperationQueue new]; NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadDataWithOperation) object:nil]; [queue addOperation:operation]; [operation release];จากตัวอย่างเราจะ init ค่าของ NSInvocationOperation (เป็น subclass ของ NSOperation) ด้วยการกำหนด selector ชื่อ loadDataWithOperation ที่ข้างในนั้นอาจมีการทำงานบางอย่างที่ใช้เวลานาน เช่นการใช้คำสั่งเช่น
[NSString stringWithContentsOfURL: url]
queue จะจัดการ และเรียกใช้ method loadDataWithOperation ให้เราเองหลังจากที่มันถูกใส่ลงไปใน queue แล้วอัตโนมัติ
เท่านี้ UI ก็จะไม่ freeze แล้ว และชีวิตเราก็สบายขึ้น
ตัวอย่าง code เปรียบเทียบปัญหาก่อนหลัง และข้อมูลเพิ่มเติม
Related Link from Roti
0 comments:
Post a Comment