P. 1
Tìm hiểu môi trường lập trình trên điện thoại iPhone

Tìm hiểu môi trường lập trình trên điện thoại iPhone

|Views: 155|Likes:
Được xuất bản bởiEric Nguyen
Tìm hiểu môi trường lập trình trên điện thoại iPhone
Tìm hiểu môi trường lập trình trên điện thoại iPhone

More info:

Categories:Types, Research
Published by: Eric Nguyen on Feb 28, 2013
Bản quyền:Attribution Non-commercial
Giá Niêm yết:$0.99 Mua Ngay

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
See more
See less

06/09/2015

$0.99

USD

pdf

text

original

PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP

1. Thông tin về sinh viên Họ và tên sinh viên: .An Thị Hồng Điện thoại liên lạc: 0984393387 Lớp: CNPM Email: rosenangiyala@gmail.com Hệ đào tạo: Đại học chính quy

Đồ án tốt nghiệp được thực hiện tại: Đại học Bách Khoa Hà Nội Thời gian làm ĐATN: Từ ngày 28 /02/2010 đến 28/05 /2010

2. Mục đích nội dung của ĐATN - Tìm hiểu môi trường lập trình trên điện thoại iPhone - Tìm hiểu mô hình cổng thông tin tìm kiếm trực tuyến trên điện thoại di động - Xây dựng ứng dụng hỗ trợ người dùng trên điện thoại (thành phần client) 3. Các nhiệm vụ cụ thể của ĐATN Từ các mục đích nội dung, các nhiệm vụ cụ thể của đồ án sẽ thực hiện - Tìm hiểu về lập trình trên điện thoại di động - Tìm hiểu về iPhone - Tìm hiểu công cụ, ngôn ngữ, nền tảng lập trình cho điện thoại iPhone - Tìm hiểu lập trình mạng, multithreading, media cho iPhone - Tìm hiểu mô hình hệ thống Mobile Portal - Xây dựng ứng dụng tìm kiếm đa phương tiện trên điện thoại iPhone

Sinh viên thực hiện: An Thị Hồng - Khóa 50 - CNPM

1

4. Lời cam đoan của sinh viên: Tôi - An Thị Hồng - cam kết ĐATN là công trình nghiên cứu của bản thân tôi dưới sự hướng dẫn của Thạc sĩ Lương Mạnh Bá. Các kết quả nêu trong ĐATN là trung thực, không phải là sao chép toàn văn của bất kỳ công trình nào khác.

Hà Nội, ngày 24 tháng 05 năm 2010 Tác giả ĐATN

An Thị Hồng 5. Xác nhận của giáo viên hướng dẫn về mức độ hoàn thành của ĐATN và cho phép bảo vệ:

Hà Nội, ngày tháng năm Giáo viên hướng dẫn

Ths Lương Mạnh Bá

Sinh viên thực hiện: An Thị Hồng - Khóa 50 - CNPM

2

TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP
Nhận thức được nhu cầu tìm kiếm thông tin trên di động, hệ thống cổng thông tin di động Mobile Portal đã ra đời và bắt đầu đi vào hoạt động. Mobile Portal sử dụng công nghệ tìm kiếm của máy tìm kiếm Socbay (trang chủ www.socbay.com) được phát triển bởi Công ty Cổ phần dịch vụ công nghệ thông tin Naiscorp với khả năng đem lại cho người dùng những thông tin đã được sàng lọc, lựa chọn và chuẩn hóa riêng cho thiết bị di động. Trọng tâm của đồ án xin trình bày thành phần client của hệ thống Mobile Portal - Ứng dụng Petto được phát triển trên nền tảng iPhone. Các phần chính của báo cáo: Phần 1: Nền tảng công nghệ Chương 1: Tìm hiểu về môi trường lập trình trên di động, tổng quan về lập trình iPhone. Giới thiệu ngôn ngữ, công cụ lập trình. Tìm hiểu lập trình mạng, mutithread, core audio. Chương 2: Đưa ra mô hình tổng quan về cổng thông tin tìm kiếm trực tuyến. Từ đó đưa ra ứng dụng mà đồ án xây dựng là “xây dựng ứng dụng tìm kiếm đa phương tiện trên điện thoại iPhone” – thành phần đóng vai trò client trong mô hình. Phần 2: Xây dựng chương trình Chương 3: Giới thiệu các loại ứng dụng trên iPhone, phát biểu bài toán cần giải quyết. Chương 4: Xây dựng các dịch vụ tìm kiếm đa phương tiện. Phân tích, thiết kế ứng dụng.

Sinh viên thực hiện: An Thị Hồng - Khóa 50 - CNPM

3

..1 Ngôn ngữ Objective-C....................................... iPhone SDK:..............................................................................10 CHƯƠNG 1: TÌM HIỂU MÔI TRƯỜNG LẬP TRÌNH TRÊN IPHONE............. 66 1... 43 2........................................................................... đối tượng và thông điệp. 28 1.Controller)..................3....................................................................... Lớp..............................................................................2..................................................... 54 1............32 1....................8 LỜI NÓI ĐẦU....................................................................................................................................................2......................2 Tổng quan về lập trình iPhone......................................................3.........................................10 1........14 1........................3.............1 Tổng quan về lập trình trên di động........................................................ 16 1..........1 TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP .............. Cài đặt iPhone SDK:.................... Quản lý thread..................... 37 1..................................................... Mở Interface Builder:.................................................................... Phân tích một ứng dụng:.................. 20 3.... 26 3..............................................4....11 1................................. Run loop............................. Những khó khăn khi lập trình cho di động.............................................................................................. 10 1...................................9 PHẦN I: NỀN TẢNG CÔNG NGHỆ............................... Môi trường lập trình iPhone..................4 Lập trình mạng............................. 14 1...3 Công cụ lập trình.................................Mô hình MVC ( Model ...................................................5 Xcode...................7 DANH MỤC BẢNG.................3......................................Khóa 50 ....................................... Cơ bản về Core Audio................................................................10 1...................................6................................................ Các template thường dùng. Core Audio là gì?...........1 Giới thiệu về iPhone............................................... 26 1.......... 16 2............................ 43 1......................................................................................................................2 Các nền tảng phát triển di động hứa hẹn trong năm 2010 ................ 33 3.................... 22 1...................12 1. Về lập trình thread............................MỤC LỤC PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP..................................................................2....................................................................... 16 1................................................................................................... 44 1...................................2...........View ....CNPM 4 ...........5 MultiThreading............................. 32 2....................................................... 26 2..6 Interface Builder.......................................................................... Giới hạn của iPhone.........3.............2. 70 1. Core Audio...................................... Lập trình mạng với CFNetwork......................... Sự bố trí của một project trong Xcode..................................................2............................... 72 Sinh viên thực hiện: An Thị Hồng ................23 2.......................................... iPhone Simulator:....................... Định nghĩa một lớp.......................................3 DANH MỤC HÌNH......................2....................... Lịch sử của ngôn ngữ Objective-C...................1..............................1 Thị trường lập trình trên di động........................... 23 1.......1......................................................................................... Tổng quan:.................. Tạo file Interface Builder.................................... Cuộc cách mạng về công nghệ trên điện thoại di động mang tên iPhone..................... 32 1..................................... 24 3........................................................ 60 3........................................................................................................................................... 70 2................. Cửa sổ tài liệu............12 2... 54 2.................................................................. 12 1............ 24 1...............................................

Dịch vụ Tin Tức:.....................................................................................82 2............................................. 99 4............................................4....4.......83 PHẦN II: XÂY DỰNG CHƯƠNG TRÌNH................3...............................................2....................96 4..........................100 4........................................................1..........................3.................105 4............................................86 4.............. 4............................................1.......... 90 Hình ảnh...... 88 Địa điểm....................... 4......................................................................4........108 TÀI LIỆU THAM KHẢO....................................4............................................................1 Các loại ứng dụng trên iPhone..........................................4.............................................................1 Quá trình chuẩn hóa dữ liệu cho thiết bị di động:........2..........................100 2....................... Tầng Mobile Interface:.............5...........................7.................2........................2 Đặc tả user case:.....................................................................2 Thiết kế module kết nối tại client và server................... 80 2..................... Tầng Cocoa Touch Application...............................1 Xác định yêu cầu hệ thống:............. 4............................81 2.............78 2.84 3................................5......................................................84 CHƯƠNG 3: ỨNG DỤNG TRÊN IPHONE.. 99 Dịch vụ Nhạc MP3:. Lớp ứng dụng:...................2.......................................... 92 4................................................................................4..................2 Phát biểu bài toán.... 102 3........ Tin tức....................................................................................81 2...............5..........2........................ 98 Dịch vụ Hình Ảnh:...... Quan hệ giữa tầng Mobile Interface và Cocoa Touch Application:......................4.......4 Thiết kế giao diện:...5 Ứng dụng Petto...........................84 CHƯƠNG 4: XÂY DỰNG CÁC DỊCH VỤ TÌM KIẾM ĐA PHƯƠNG TIỆN DỰA TRÊN MÁY TÌM KIẾM SOCBAY........1 Hệ thống Mobile Portal......................................... Dịch vụ nhạc MP3........................78 2.........2...............107 3 Hướng phát triển:...................................2 Phân tích truy vấn ngắn dựa trên thói quen người dùng.......................................93 4..........................................107 1....................2.........3 Các vấn đề kỹ thuật..5.............................................................................................................................................................................................. 100 1.....................................3.................... Thu thập dữ liệu cho các dịch vụ..............................................................106 TỔNG KẾT ĐÁNH GIÁ........................ 96 Dịch vụ Tin Tức:............. 94 4.. Việc kết nối..3.................. 89 Cẩm nang tư vấn. 4.........................2 Máy tìm kiếm Socbay (Socbay Search Engine)...... 98 Dịch vụ Cẩm Nang Tư Vấn:.................................4.......3.............107 2 Nhược điểm.....109 Sinh viên thực hiện: An Thị Hồng ........................................ 94 4...................................................3................................................................................................................................................................5 Thiết kế lớp:. 97 Dịch vụ Truyện:.........................4.............................................. 91 Nhạc MP3......................................................... truyền nhận dữ liệu giữa client và server:..........83 2.....6...................................................... 97 Dịch vụ Địa Điểm:............................4.... Hiển thị ................................2... Giao diện chính:..................................CHƯƠNG 2: TỔNG QUAN VỀ HỆ THỐNG TÌM KIẾM MOBILE PORTAL....................................................................................................4.........86 4.....................................79 2........ 4...........CNPM 5 .. 4...............................................................2...........................3..............5......1............................................... 87 Đọc truyện.................................. Một số kết quả đạt được... 104 4.....84 3..... MP3 streaming......................... 4........1... thuật toán....................3. 4.... 4...............................................Khóa 50 .......... 4................4 Tầng giao diện di động (Mobile Interface).6.....................................................3.....................................1...................................93 4..................................87 4................................................ 4........2........................

Khóa 50 .Sinh viên thực hiện: An Thị Hồng .CNPM 6 .

.....4 XCODE EDITOR..........9 BẢNG KẾT NỐI CỦA INTERFACE BUILDER........2 APPLE DEV CENTER..................................................78 HÌNH 2.......................1 USERCASE TỔNG THỂ CỦA HỆ THỐNG.74 HÌNH 2.................4 GIAO DIỆN CHÍNH CỦA DỊCH VỤ TIN TỨC....................................10 BIỂU ĐỒ LỚP CỦA TẦNG ỨNG DỤNG COCOA TOUCH.29 HÌNH 1...............98 HÌNH 4...............3 GIAO DIỆN CHÍNH CỦA ỨNG DỤNG..........2 MP3 STREAMING..........39 HÌNH 1..........23 HÌNH 1.NEW FILE...............13 CẤU TRÚC CFSTREAM API....................CNPM 7 ..............................32 HÌNH 1......47 HÌNH 1...................72 HÌNH 1........................11 CẤU TRÚC FILE THỰC THI CỦA MỘT LỚP........97 HÌNH 4....40 HÌNH 1............27 HÌNH 1....100 Sinh viên thực hiện: An Thị Hồng ..........1 CÁC NỀN TẢNG LẬP TRÌNH DI ĐỘNG.........................1 MÔ HÌNH ĐƠN GIẢN CỦA SOCBAY SEARCH ENGINE..71 HÌNH 1........NEW PROJECT ..17 BA LỚP API CỦA CORE AUDIO....3 XCODE ........5 INTERFACE BUILDER ......25 HÌNH 1.............................30 HÌNH 1......95 HÌNH 4..................................................... KIẾN TRÚC CORE AUDIO CỦA HỆ ĐIỀU HÀNH IPHONE.....................................................................................................................6.......................................................9 GIAO DIỆN CHÍNH CỦA DỊCH VỤ NHẠC MP3......7 CỬA SỔ THƯ VIỆN INTERFACE BUILDER.....7 GIAO DIỆN CHÍNH CỦA DỊCH VỤ CẨM NANG TƯ VẤN.96 HÌNH 4.....................................................99 HÌNH 4.....8 CỬA SỔ THUỘC TÍNH INTERFACE BUILDER.......................................16................................................31 HÌNH 1....6 GIAO DIỆN CHÍNH CỦA ĐỊA ĐIỂM..................97 HÌNH 4......73 HÌNH 1...........5 GIAO DIỆN CHÍNH CỦA DỊCH VỤ TRUYỆN.....15 KIẾN TRÚC CORE AUDIO CỦA MAC OS X..12 CFNETWORK VÀ CÁC LỚP PHẦN MỀM KHÁC TRONG MAC OS X 45 HÌNH 1........................................ CỬA SỔ TÀI LIỆU INTERFACE BUILDER....................86 HÌNH 4..............11 HÌNH 1...................14 CẤU TRÚC VÀ NGUỒN CỦA RUNLOOP................21 HÌNH 1........................Khóa 50 .....99 HÌNH 4..98 HÌNH 4...........................1 MÔ HÌNH HỆ THỐNG MOBILE PORTAL...............10 CẤU TRÚC FILE GIAO DIỆN CỦA MỘT LỚP................8 GIAO DIỆN CHÍNH CỦA DỊCH VỤ HÌNH ẢNH.......DANH MỤC HÌNH HÌNH 1.80 HÌNH 4....67 HÌNH 1................18 CẤU TRÚC CORE AUDIO CỦA HỆ ĐIỀU HÀNH IPHONE..

.............90 BẢNG 4....12 BIỂU ĐỒ LỚP CỦA DỊCH VỤ TIN TỨC.............................5 CÁC CÔNG NGHỆ CÓ THỂ SỬ DỤNG THAY THẾ THREAD TRONG ỨNG DỤNG.................HÌNH 4..........4 PROPERTY ATTRIBUTE.............................28 BẢNG 1...........................................57 BẢNG 1....................................................1 CÁC TEMPLATE ỨNG DỤNG THƯỜNG DÙNG.....................104 HÌNH 4..................Khóa 50 .....................................6 ĐẶC TẢ USERCASE DỊCH VỤ HÌNH ẢNH......................64 BẢNG 1.....9 CẤU HÌNH THREAD........................................6 CÁC LOẠI THREAD.........81 BẢNG 4.....42 BẢNG 1........................................................93 Sinh viên thực hiện: An Thị Hồng ..........................105 DANH MỤC BẢNG BẢNG 1.........................3 ĐẶC TẢ USERCASE DỊCH VỤ TRUYỆN.....................................................................4 ĐẶC TẢ USERCASE DỊCH VỤ ĐỊA ĐIỂM......41 BẢNG 1..92 BẢNG 4..................5 ĐẶC TẢ USERCASE DỊCH VỤ CẨM NANG TƯ VẤN.......24 BẢNG 1..2 CÁC TEMPLATE CỦA INTERFACE BUILDER.....................60 BẢNG 1..............1 CÁC DỊCH VỤ.......................102 HÌNH 4..............62 BẢNG 1...3 CÁC PHƯƠNG THỨC QUẢN LÝ BỘ NHỚ CỦA OBJECTIVE-C.......................................89 BẢNG 4.............................................................................8 CHI PHÍ SỬ DỤNG THREAD.................13 BIỂU ĐỒ LỚP CỦA DỊCH VỤ NHẠC MP3......CNPM 8 ..........101 HÌNH 4.....14 BIỂU ĐỒ LỚP CỦA TẦNG MOBILE INTERFACE............7 ĐẶC TẢ USERCASE DỊCH VỤ NHẠC MP3.....7 GIAO TIẾP GIỮA CÁC THREAD..........57 BẢNG 1..68 BẢNG 2..88 BẢNG 4....91 BẢNG 4................................................................2 ĐẶC TẢ USERCASE DỊCH VỤ TIN TỨC.10 CÁC CHẾ ĐỘ RUN LOOP...............................................11 BIỂU ĐỒ LỚP CỦA LỚP ỨNG DỤNG....

CNPM 9 . An Thị Hồng Sinh viên thực hiện: An Thị Hồng .Bộ môn Công nghệ phần mềm.LỜI NÓI ĐẦU Đồ án tốt nghiệp này đã được hoàn thành sau một thời tìm hiểu. Bộ môn Công nghệ phần mềm nói riêng đã tận tình giảng dạy. định hướng và chỉ dạy tận tình giúp em vượt qua những khó khăn trong quá trình em làm đồ án tốt nghiệp. Viện Công nghệ Thông tin và Truyền thông. em cũng xin gửi lời cảm ơn đến anh Nguyễn Xuân Tài. trường Đại học Bách Khoa Hà Nội đã hết lòng giúp đỡ. Ngoài sự cố gắng và nỗ lực của bản thân. còn có sự giúp đỡ của nhiều người để em có thể hoàn thành được đồ án như ngày nay. Trước hết. Em xin được gửi lời cảm ơn tới các thầy cô giáo trong trường Đại học Bách Khoa Hà Nội nói chung và các thầy cô trong viện Công nghệ Thông tin và Truyền thông. truyền đạt cho em những kiến thức. em xin được gửi lời cảm ơn sâu sắc đến ThS Lương Mạnh Bá . xây dựng tại Công ty Cổ phần dịch vụ công nghệ thông tin Naiscorp. những kinh nghiệm quý báu trong suốt 5 năm học tập và rèn luyện tại trường Đại học Bách Khoa Hà Nội. Ngoài ra. anh Mai Đình Thắng và các anh chị em công ty Naiscorp đã tạo điều kiện để em có thể hoàn thành sản phẩm và cũng là đồ án của mình.Khóa 50 .

PHẦN I: NỀN TẢNG CÔNG NGHỆ
CHƯƠNG 1: TÌM HIỂU MÔI TRƯỜNG LẬP TRÌNH TRÊN IPHONE 1.1 Tổng quan về lập trình trên di động
1.1.1 Thị trường lập trình trên di động Số lượng thiết bị di động ngày càng tăng ở Việt Nam, nhiều người đã coi điện thọai di động như một vật không thể thiếu trong cuộc sống hằng ngày. Cùng với sự phát triển mạnh mẽ của công nghệ thông tin trong thời đại mới, người sử dụng di động bắt đầu hướng tới những nhu cầu cao cấp hơn. Không chỉ nghe-gọi, nhắn tin mà giờ đây họ còn muốn sở hữu một chiếc điện thoại có khả năng truy cập mạng và thực hiện mọi ứng dụng như một chiếc máy tính bỏ túi. Để có thể thực hiện được các tính năng cao cấp như đọc báo, tiểu thuyết, tra từ điển, bản đồ và nhất là thế giới giải trí với ca nhạc, xem phim, chơi game… thì ngoài nền tảng phần cứng do nhà sản xuất điện thoại cung cấp còn cân phải có các phần mềm chuyên dụng cài đặt trên di động để thực hiện các chức năng trên. Tuy nhiên, thị trường di động là một thị trường rất sôi động với đủ loại thiết bị di động của các nhà sản xuất có kiểu dáng, tính năng, tốc độ xử lý, bộ nhớ trong, màn hình giao diện…. khác nhau. Và cũng vì có nhiều nhà sản xuất mà lại không có một chuẩn công nghệ (về mặt phần mềm) nào được áp dụng chung cho tất cả các máy điện thoại di động nên công việc lập trình cho điện thoại di động đúng là một bài toán khó cho các lập trình viên. Việc lựa chọn một nền tảng phát triển cho điện thoại di động cũng là một vấn đề nan giải. Hiện nay có thể kể tên các nền tảng di động phổ biến: iPhone, Window Mobile, Android, J2ME, Symbian. Nhìn vào hình dưới đây có thể thấy được phần nào sự phong phú của thị trường này.

Sinh viên thực hiện: An Thị Hồng - Khóa 50 - CNPM

10

Hình 1.1 Các nền tảng lập trình di động

1.1.2. Những khó khăn khi lập trình cho di động So với chiếc máy tính để bàn hay laptop, chỉ với bộ nhớ trong vài GB, RAM cao nhất là 256 MB, bộ nhớ của chiếc điện thoại di động quả là quá nhỏ. Hơn nữa, một phần bộ nhớ này lại đã được sử dụng để chạy hệ điều hành, xử lý đồ họa… Do đó khi viết ứng dụng, lập trình viên phải chú ý nhiều đến bộ nhớ. Có thể nói rằng lập trình cho di động giống như việc đẩy các lập trình viên về với thời kỳ đầu của lập trình cho máy tính cá nhân, phải tiết kiệm từng KB bộ nhớ một nếu không muốn xảy ra tình trạng tràn bộ nhớ. Người sử dụng ứng dụng trên di động đòi hỏi tốc độ phải nhanh, ví như mở một game, người ta không thể ngồi chờ cả chục phút để game load xong. Do đó, quá trình đóng, mở ứng dụng phải diễn ra nhanh chóng. Hơn nữa, dù có thông minh đến mấy, nhiều chức năng đến mấy, chiếc điện thoại di động cũng phải là “chiếc điện thoại” trước đã. Vậy khi đang chạy ứng dụng, bất thình lình có một tin nhắn hay một cuộc gọi Sinh viên thực hiện: An Thị Hồng - Khóa 50 - CNPM 11

đến thì sao? Ứng dụng phải được đóng tạm thời một cách nhanh chóng, lưu trữ lại trạng thái trước khi đóng, cho người dùng nhận tin nhắn, cuộc gọi (nếu người dùng lựa chọn nhận), sau đó lại cho phép người dùng trở lại ứng dụng với trạng thái trước đó. Sức hấp dẫn của Internet là không thể chối cãi. Người dùng muốn truy cập internet mọi lúc mọi nơi, người lập trình thì muốn tạo ra các ứng dụng có khả năng khai thác nguồn tài nguyên vô tận của internet. Tuy nhiên không phải thiết bị di động nào cũng có khả năng truy nhập internet. Vì vậy, cần phải hiểu về các dịch vụ phần cứng của thiết bị đó hỗ trợ. Tư tưởng “code một chỗ, dùng ở mọi nơi” khó mà áp dụng được cho lĩnh vực lập trình di động. Ví dụ như với các dòng máy cho phép cài đặt các ứng dụng viết bằng ngôn ngữ Java. Về lý thuyết, chương trình Java được xây dựng xong có thể đem đi mọi nơi có máy ảo Java để chạy. Nhưng các thiết bị di động của các hãng khác nhau lại có bộ nhớ cùng với tốc độ xử lý khác nhau, phải hiểu rõ sự khác nhau này thì mới có thể điều chỉnh cho ứng dụng có thể chạy trên các dòng máy khác nhau. Hơn nữa, màn hình hiển thị của các thiết bị di động cũng “trăm hoa đua nở” với kích thước, độ phân giải màn hình… không theo một chuẩn nhất định nên chắc chắc sẽ không ra kết quả như mong muốn khi cài đặt cùng một ứng dụng lên các thiết bị khác nhau mà không có sự sửa đổi hiển thị đầu ra cho phù hợp. Mặt khác, các thiết bị di động cũng tiếp nhận tương tác của người dùng rất khác nhau: qua bàn phím, chuột, bút, cảm ứng… nên lập trình viên cũng cần phải lưu ý đến điều này. Màn hình của các thiết bị di động rất bé so với máy tính để bàn hay máy tính xách tay nên các ứng dụng cũng không thể có giao diện quá phức tạp bởi như thế sẽ làm rối mắt người sử dụng.

1.2 Tổng quan về lập trình iPhone
1.2.1 Giới thiệu về iPhone 1. Cuộc cách mạng về công nghệ trên điện thoại di động mang tên iPhone Tháng 6 năm 2007, chiếc iPhone thế hệ đầu tiên ra mắt và mở đầu cho cơn sốt iPhone trên toàn thế giới. Không hổ danh là công ty luôn đi đầu về công nghệ, Apple đã tạo ra thay đổi mang tính cách mạng với chiếc điện thoại di động khi giới thiệu một giao diện người dùng hoàn toàn mới trên nền tảng màn hình cảm ứng đa điểm và phần mềm mới có tính tiên phong. Hệ điều hành của iPhone giúp người dùng có thể điều khiển chiếc điện thoại của họ chỉ bằng một thao tác nhấn, gảy hoặc chụm tay. Sinh viên thực hiện: An Thị Hồng - Khóa 50 - CNPM 12

rồi đọc vào tên hay số điện thoại của một người liên lạc để gọi điện. iPhone cũng mở nhạc và tạo ra các danh mục mở (playlist). bằng cách chỉ việc dùng khẩu lệnh. iPhone phản ứng với các chuyển động bằng một gia tốc kế lắp bên trong. Nhấn và giữ nút Home để mở chế độ Voice Control (Điều Khiển Bằng Khẩu Lệnh).Đến năm 2008. Với iPhone 3GS. Khi chụp ảnh bằng camera iPhone có thể gắn thẻ địa lý (geotag). iPhone có màn hình cảm ứng đa điểm. kể cả các biểu tượng trên Thanh Công Cụ theo ý muốn của mình. khi người dùng chia sẻ hình ảnh trên mạng. cho xem toàn bộ chiều rộng của trang web. kéo. Khi người dùng quay iPhone từ phương đứng sang phương ngang. ghi các thông tin về địa điểm GPS (Hệ Thống Định Vị Toàn Cầu) cho nó.một “cửa hàng” các ứng dụng cho iPhone. Apple lại cho ra mắt iPhone 3G cùng với App Store .Khóa 50 . thả… iPhone loại bỏ hoàn toàn sự xuất hiện của bàn phím thật. Sinh viên thực hiện: An Thị Hồng . hoặc bản ghi chú gia tốc kế cũng được sử dụng để kiểm soát việc chơi game hay đảo ngược hành động trước đó (như lệnh “Shake to Undo”). gia tốc kế phát hiện ra chuyển động này và thay đổi màn hình. Bàn phím ảo này cho phép người dùng chuyển đổi qua lại giữa 40 dạng bàn phím quốc tế và có phần mềm nhận dạng ký tự cho phép người dùng viết các ký tự Trung Hoa bằng ngón tay rồi nhấn chọn kết quả thích hợp. hình ảnh. iPhone cung cấp các dữ liệu vị trí để tìm đến các ứng dụng cài đặt sẵn và Cửa Hàng Ứng Dụng (App Store). người dùng có thể tự điều chỉnh và sắp xếp các biểu tượng trên màn hình Chủ (Home screen). bạn bè và gia đình có thể biết được địa điểm của hình chụp. Đây là một trong các tính năng mới được thêm vào sau này của iPhone iPhone 3GS được chuẩn hóa bằng các tính năng tiếp cận sử dụng (accessibility) hỗ trợ cho người khuyết tật. Nhờ vậy. Màn hình cảm ứng đa điểm tận dụng xúc giác tự nhiên của khách hàng mà không thông qua bút stylus. thay vào đó là bàn phím thông minh hoạt động trên cơ sở phần mềm. Các thao tác trên máy được thực hiện dễ dàng chỉ bằng cách đặt ngón tay lên màn hình nhấn. iPhone phân tích các cú gõ để đề nghị các từ mà người dùng gõ vào. và học được những từ người dùng thường hay gõ nhất – kể cả tên riêng và thông tin trong sổ liên lạc (contact list) của họ. bàn phím ảo hoàn toàn thay thế bàn phím thật và có một gia tốc kế bên trong.CNPM 13 . tin nhắn.

Không thể ghi vào bất cứ nơi nào ngoài sandbox của ứng dụng.2 Các nền tảng phát triển di động hứa hẹn trong năm 2010 Năm 2010 sẽ đánh dấu một năm đầy sôi động với sự ra mắt của iPhone 4. Không có nhiều không gian để làm việc cùng. tiếp tục phát triển Maemo và gần đây là kết hợp với Intel để xây dựng thành MeeGo. Windows Phone và BlackBerry mới. điện thoại… Tuy nhiên. đã làm cho iPhone.CNPM 14 . Ứng dụng có vòng đời ngắn: các ứng dụng iPhone không thể thường trú trong bộ nhớ. Vùng có thể truy nhập trong một ứng dụng được gọi là sandbox. hạn chế này sẽ sớm được khắc phục khi Apple đang dự kiến cho ra mắt iPhone 4. Windows Mobile. Nokia sau khi sở hữu Symbian. đang có kế hoạch nâng cấp webOS lên phiên bản mới. Kích thước màn hình nhỏ cũng dẫn tới việc chỉ có duy nhất 1 cửa sổ có thể hiển thị tại một thời điểm. Dưới đây là 5 nền tảng di động đã được các nhà sản xuất thông báo chính thức. Không thể đọc file được tạo bởi ứng dụng khác. ngoài ra Android cũng sắp được Google nâng cấp bản 2.2. các nền tảng Symbian. Bảo mật: chỉ có thể đọc và ghi vào thư mục là một phần của gói ứng dụng. Bộ nhớ và tốc độ xử lý này quá giới hạn so với các máy tính cá nhân hiện nay hiện nay. iPhone chỉ cho phép 1 chương trình chạy tại một thời điểm đo đó cần lưu ý tới các trường hợp như đang chạy ứng dụng thì có tin nhắn. Màn hình nhỏ: màn hình của iPhone có độ phân giải 480 x 320 pixel. Tự quản lý bộ nhớ do iPhone không có bộ gom rác (garbage collection).2. Symbian đã có một quá khứ thành công. Smartphone ngày một chiếm thị phần lớn trên tổng số điện thoại di động bán ra. Palm OS. tuy nhiên việc chậm thay đổi. 1. và sẽ có mặt trên thị trường trong thời gian tới.2.0. Các ứng dụng thường trú trong bộ nhớ là ứng dụng có thể chạy ẩn trong khi người dùng chạy ứng dụng khác. Palm sau khi về tay HP. Chưa bao giờ. Sinh viên thực hiện: An Thị Hồng .org đã đánh giá iPhone có tốc độ xử lý tầm 600 MHz và 128MB bộ nhớ vật lý.Khóa 50 . song song. làng di động lại có nhiều hệ điều hành cho smartphone như hiện tại. Android thay đổi cục diện khi liên tục gia tăng thị phần trong hai năm gần đây. Giới hạn của iPhone Bộ nhớ và tốc độ xử lý: Mặc dù Apple không tiết lộ thông tin về tốc độ sử lý và bộ nhớ nhưng hacker Craig Hockenberry trên trang furborg. cuộc chiến giữa các nền tảng ngày một nóng bỏng hơn.0 với hệ điều hành đa nhiệm trong năm nay.

dễ dùng. Sau phiên bản Windows Mobile 6. 3GS và iPod Touch. RIM chưa đưa ra chi tiết về hệ điều hành mới. Nokia N8 là thiết bị đầu tiên sử dụng hệ điều hành này. • Symbian^3 Symbian^3 là bản nâng cấp từ S60 phiên bản thứ 5. iPhone OS 4. Windows Phone không có sự kế thừa nào so với nền tảng trước của hãng về giao diện. • BlackBerry 6 BlackBery OS 6 được RIM công bố tại sự kiện Wireless Enterprise Symposium (diễn ra từ 27 đến 29/4 tại Mỹ).. HTC. thay đổi được coi là đáng kể nhất. ngoài Sinh viên thực hiện: An Thị Hồng . Symbian^3 không có nhiều thay đổi từ Menu.CNPM 15 . Nền tảng mới sẽ xuất hiện mùa hè năm nay và cho phép cài đặt lên các mẫu iPhone từ 3G. tháng 2 vừa rồi. những chiếc di động thiết kế đẹp. cho phép trượt và chuyển đổi cùng công nghệ cảm ứng đa điểm.• iPhone 4. trong khi Windows Mobile ngược lại. tất cả đều được làm mới. một phiên bản di động thế hệ thứ tư của Apple gần như chắc chắn sẽ có mặt vào tháng 6 tới. trước khi Nokia trình làng Symbian^4. khá rắc rối. Tuy nhiên. Acer. theo đó điện thoại thông minh cần đơn giản.0 đã có thể chạy đa nhiệm. sự khác biệt là hệ điều hành này có thêm 3 màn hình Home. cùng với hệ điều hành này. hệ điều hành sẽ có mặt trên di động vào cuối năm nay. và nhiều thương hiệu khác cam kết sẽ ra mắt di động chạy Windows Phone 7 vào cuối năm. các biểu tượng. sự xuất hiện của iPhone đã mang tới cho người dùng những suy nghĩ mới. chụp ảnh 12 Megapixel. So với S60.Khóa 50 . model mạnh mẽ. Microsoft giới thiệu Windows Phone 7..0 Có thể nói iPhone 4. Sự thành công của iPhone không chỉ bởi nền tảng có giao diện đơn giản. Tuy nhiên. và được xem là nền tảng tạm thời. So với các phiên bản trước. từ các hub chứa ứng dụng đến các bố trí icon. cách bố trí màn hình Home.5 ra mắt năm ngoái. • Windows Phone 7 Windows Mobile là một trong những nền tảng khai sinh smartphone với nhiều ứng dụng.0 là nền tảng được mong chờ nhất hiện nay. mà Apple đã xây dựng một "hệ sinh thái" với vô số ứng dụng trong App Store. Gần như. LG. Hiện tại. các tính năng giải trí đa phương tiện. Microsoft cũng đang tích cực phát triển gian ứng dụng Market Place và công cụ cho các lập trình viên xây dựng phần mềm. N8 sẽ ra mắt vào quý III.

iPhone SDK: 1. và các ứng dụng nhập vai.5. Bada dành cho màn hình cảm ứng. iPhone SDK build file thực thi nhị phân cho chương trình và gửi các file nó cần vào thư mục chương trình này. tương tác.CNPM 16 . menu pop-up. Do vậy. Đây là thư mục của ứng dụng. 1.Khóa 50 . khả năng chuyển dịch. • Samsung Bada Samsung từng sản xuất di động chạy Windows Mobile. các nhà phát triển có thể viết các ứng dụng về giao diện Flash. Ứng dụng chỉ được thực thi Sinh viên thực hiện: An Thị Hồng .4. Bada đang được Samsung hoàn thiện. điều khiển chuyển động.apple. để xây dựng một ứng dụng hoàn thiện. IDE: Xcode Ngôn ngữ lập trình: Ojective – C 1.. nhận dạng khuôn mặt. trình duyệt web mới dựa trên nền tảng WebKit tương thích HTML5. màn hình Home mới. hãng cũng đã giới thiệu công cụ lập trình. máy sẽ bán ra trong quý này.một đoạn video quảng cáo khá ấn tượng. Android.2.app không phải biểu diễn một file mà là một thư mục. các file hỗ trợ cần được cài đặt phải được chỉ ra cho Xcode IDE. Môi trường lập trình iPhone Hệ điều hành: MacOS hoặc OS X 10.2. Samsung Wave S8500 là model đầu tiên chạy nền tảng này.com/iphone/. Nhìn vào bất kỳ ứng dụng Mac nào cũng sẽ thấy rằng phần mở rộng . Bada là nền tảng của hãng phát triển riêng. Môi trường: iPhone SDK. iPhone SDK có thể download miễn phí từ trang http://developer. Ngoài ra. nhấn mạnh vào các yếu tố như giải trí. điều khiển web. BlackBerry OS 6 hỗ trợ khả năng điều khiển trên màn hình cảm ứng đa điểm tốt hơn...3. thời tiết. Trong đó là một cấu trúc có tổ chức chứa các tài nguyên mà ứng dụng cần cũng như các thuộc tính mang thông tin về ứng dụng và file thực thi nhị phân của ứng dụng. Phân tích một ứng dụng: Hệ điều hành OS X của Apple là một platform xây dựng dựa trên nền tảng UNIX nên kế thừa các quy ước cơ bản của UNIX về file.. nhiều cải tiến từ giao diện. Hiện tại. với giao diện có nhiều đường nét của TouchWiz.* trở lên. Theo những thông tin đầu tiên. kết nối.

bên trong “sandbox” của iPhone. Thuật ngữ “sandbox” dùng để chỉ vùng giới hạn ngăn không có các ứng dụng truy xuất vào các tài nguyên không được cho phép. Một trong các chức năng của nó là ngăn chặn bất kỳ hoạt động đọc hay ghi nào ở bên ngoài thư mục home đã được chỉ định cho 1 ứng dụng. Tất cả những gì một chương trình cần để chạy phải được chứa trong thư mục home. Hơn nữa, ứng dụng sẽ không biết được nơi nó được cài đặt mà đây sẽ là định danh duy nhất được thêm vào đường dẫn của ứng dụng mỗi lần cài đặt. Muốn tìm ra đường dẫn cài đặt chỉ có cách duy nhất là sử dụng các hàm như là NSHomeDirectory hay lớp như là lớp NSBundle. Mỗi ứng dụng iPhone có một thư mục home riêng chứa thư mục Library và Documents, và thư mục tmp để chứa các file tạm.Thư mục chương trình của ứng dụng iPhone có cấu trúc đơn giản hơn của ứng dụng Mac cho máy tính để bàn, và tất cả các tài nguyên của ứng dụng đều được lưu trữ ở gốc của thư mục chương trình .app. Ví dụ một thư mục home hoàn chỉnh của một ứng dụng iPhone:
drwxr-xr-x drwxr-xr-x drwxr-xr-x drwxr-xr-x drw-r--r-rw-r--r-rw-r--r-rw-r--r-rwxr-xr-x -rw-r--r-rw-r--r-rw-r--rdrwxr-xr-x mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile mobile Documents/ Library/ Preferences/ MyApp.app/ _CodeSignature Default.png icon.png Info.plist MyApp pie.png PkgInfo ResourceRules.plist tmp/

Danh sách này phản ánh một ứng dụng iPhone rất cơ bản có tên MyApp: Documents: thư mục đặc biệt chứa các tài liệu của ứng dụng được tạo bởi người dùng. Nó không chia sẻ tài liệu với các ứng dụng khác. Library: thư mục chứa các thiết lập (setting) và các tài nguyên khác được tạo ra sau khi cài đặt. Thư mục này còn chứa một thư mục con là Preferences chứa các ưu tiên (preference) của ứng dụng.

Sinh viên thực hiện: An Thị Hồng - Khóa 50 - CNPM

17

MyApp.app: thư mục ứng dụng biểu diễn ứng dụng thực sự. Thư mục này chứa file nhị phân thực thi và tất cả các tài nguyên hỗ trợ đáng tin. _CodeSignature: thư mục chứa chữ ký cho mỗi file trong ứng dụng để đảm bảo rằng ứng dụng không bị sửa đổi từ dạng ban đầu của nó. Tất cả ứng dụng phải được “ký” mới có thể chạy trên iPhone. Default.png: file ảnh được hiển thị ở màn hình khi ứng dụng bắt đầu được mở ra và giữ cho đến khi ứng dụng khởi động xong. Đây là một file ảnh có kích thước 320 x 480 pixel. icon.png: ảnh đại diện cho ứng dụng hiển thị lên màn hình home của iPhone. Apple khuyên nên sử dụng một biểu tượng có kích thước 57 x 57 pixel. File này có thể có tên tùy thích miễn là nó được chỉ rõ trong file Info.plist. Info.plist: danh sách các thuộc tính chứa thông tin về ứng dụng. Trong đó quan trọng nhất là tên file thực thi nhị phân và một định danh gói ( bundle identifier), sẽ được gọi khi ứng dụng bắt đầu mở pie.png: một ảnh được sử dụng làm ví dụ. iPhone framework cung cấp nhiều phương thức để lấy được tài nguyên vì vậy lập trình viên không cần truy xuất trực tiếp các tài nguyên này thông qua đường dẫn. Xcode IDE sẽ lấy tất cả các file có trong thư mục Resoure và đặt vào thư mục chương trình của ứng dụng khi project được cài đặt. PkgInfo: file này chứa 8 byte mô tả loại file cho cho ứng dụng. Khi tự xây dựng ứng dụng không cần sự trợ giúp của Xcode, phát triển viên cần phải tạo một thư mục khung .app để chứa ứng dụng. Khung .app cung cấp tất cả các thông tin cần thiết cho iPhone biết về sự tồn tại của ứng dụng như là một gói, nên nó có thể được chạy từ màn hình home của iPhone. Nếu xây dựng ứng dụng bằng Xcode, bộ khung này sẽ được Xcode sinh ra tự động. Ví dụ, sau khi biên dịch một ứng dụng có tên MyExample , Xcode tạo ra thư mục của MyExample bên trong thư mục Build của project và đặt file thực thi nhị phân và tài nguyên của nó vào trong thư mục của ứng dụng. Nếu làm bằng tay thì phải tạo ra thư mục đó: $ mkdir MyExample.app

Sinh viên thực hiện: An Thị Hồng - Khóa 50 - CNPM

18

Sau đó, Xcode sẽ sao chép danh sách thuộc tính vào thư mục ứng dụng để mô tả ứng dụng và cách thức nó được mở ra. File Info.plist biểu diễn thông tin đưới dạng XML: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com /DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleDevelopmentRegion</key> <string>en</string> <key>CFBundleDisplayName</key> <string>${PRODUCT_NAME}</string> <key>CFBundleExecutable</key> <string>${EXECUTABLE_NAME}</string> <key>CFBundleIconFile</key> <string>icon.png</string> <key>CFBundleIdentifier</key> <string>com.yourcompany.${PRODUCT_NAME:identifier}</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> <string>${PRODUCT_NAME}</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleResourceSpecification</key> <string>ResourceRules.plist</string> <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> <string>1.0</string> <key>LSRequiresIPhoneOS</key> <true/> </dict> </plist> Sinh viên thực hiện: An Thị Hồng - Khóa 50 - CNPM 19

apple. 2.png không tồn tại hay không được chỉ ra trong file Info. Sinh viên thực hiện: An Thị Hồng . trước khi download cần phải đăng ký trở thành một người phát triển ứng dụng cho iPhone.com/iphone/.Các thuộc tính quan trọng là CFBundleDisplayName.Khóa 50 . tìm đường link tới chỗ download bản SDK mới nhất. Tuy nhiên. CFBundleIdentifier và CFBundleName. Cài đặt iPhone SDK: iPhone cho phép người dùng có thể download miễn phí iPhone SDK từ trang http://developer. CFBundleIconFile. Bất cứ khi nào mở ứng dụng. Các file icon. File này sẽ được thực thi khi ứng dụng được mở ra. Thuộc tính CFBundleExecutable đặc biệt quan trọng vì nó chỉ ra tên của file thực thi nhị phân trong thư mục ứng dụng.plist.CNPM 20 . truy nhập vào trang trên. ứng dụng sẽ được tham chiếu tới sử dụng định danh này. Tuy nhiên nếu file icon.png và Default. Bởi vì định danh này là duy nhất nên nó thường được hợp nhất với một URL. CFBundleIdentifier chỉ ra định danh duy nhất của ứng dụng.png và Default. CFBundleExecutable.png cũng được sao chép vào thư mục chương trình. Để đăng ký. iPhone sẽ sử dụng hình mặc định của nó.

CNPM 21 .Hình 1. trang đăng ký sẽ mở ra với 3 tùy chọn: . code mẫu… để phát triển ứng dụng trên iPhone.Khóa 50 . Nếu không có Apple ID.Miễn phí: sử dụng Apple ID của mình để download SDK.2 Apple Dev Center Bấm vào link. người dùng không chỉ download được SDK mà còn tìm thấy nhiều link hữu ích chứa tài liệu. Sinh viên thực hiện: An Thị Hồng . có thể bấm vào nút Create Apple ID để tạo và đăng nhập vào. Khi đã đăng nhập. video.

Chỉ có sẵn một số ứng dụng của iPhone: Contacts. 3.Enterprise: giá 299$ được thiết kế cho các công ty phát triển độc quyền. Không thể truy nhập mạng EDGE/3G Không có chức năng ghi hình và ghi âm. và không hỗ trợ nhiều hơn 2 ngón tương tác lên màn hình cảm ứng. Bản SDK miễn phí cũng bao gồm cả simulator cho phép người phát triển có thể chạy hầu hết các chương trình iPhone trên máy Mac. Không thể thấy tác động của ứng dụng lên CPU và bộ nhớ của iPhone bởi máy desktop có nhiều tài nguyên hơn để chạy ứng dụng.CNPM 22 . Safari. Photos và Settings. Đồ họa chậm hay các vấn đề khác chỉ có thể phát hiện ra khi kiểm thử trên máy thật.Khóa 50 . Sinh viên thực hiện: An Thị Hồng . iPhone Simulator: iPhone Simulator là giả lập của iPhone cho phép người dùng triền khai và kiểm thử các ứng dụng iPhone trên máy tính để bàn.. hỗ trợ kỹ thuật. xoay màn hình… Tuy nhiên nó cũng có một số giới hạn nhất định do desktop không có các phần cứng cần thiết để thực hiện các tác vụ đó. Ứng dụng sẽ không nhận điện thoại gọi đến. Simulator cung cấp môi trường giống với iPhone với tùy chọn menu để giả lập khóa.Standard: với giá 99$. biên dịch ứng dụng và thực thi ứng dụng. các ứng dụng cho iPhone và iPod touch trong nhà và cho những ứng dụng phát triển cho App Store và có nhiều hơn một nhà phát triển làm việc trong một dự án. tài nguyên. Một số chức năng quan trọng không có trong simulator: Không có API đo gia tốc Chỉ giới hạn với một số cử chỉ tương tác với màn hình cảm ứng. gỡ lỗi source code. . Nó cung cấp một host các công cụ. Một trong những phần tử quan trọng nhất của iPhone SDK là Xcode. môi trường phát triển tích hợp của Apple. phân phối ứng dụng qua App Store của Apple và quan trọng nhất là khả năng kiểm tra và gỡ lỗi trên máy iPhone thực sự chứ không chỉ là trên simulator. Xcode gồm các công cụ để tạo.

2. Sinh viên thực hiện: An Thị Hồng .Controller) Phần mềm phát triển trên iPhone phải tuân theo mô hình MVC.Mô hình MVC ( Model .Khóa 50 .New Project 1. View biểu diễn các phần tử giao diện hiển thị cho người dùng và cho phép người dùng tương tác với chúng. Hình 1. Bên dưới tiêu đề iPhone OS. Mục đích của mô hình này là tách rời phần nghiệp vụ (business logic) ra khởi dữ liệu và các quy tắc áp dụng lên dữ liệu này khỏi các phần tử giao diện được hiển thị cho người dùng thấy. chọn mục Application.1.3 Xcode . phía bên phải sẽ hiện ra một số template để chọn.CNPM 23 .5 Xcode Sau khi mở Xcode. Một cửa sổ xuất hiện nhắc người dùng chọn template cho project của mình. chọn File/New Project.View . Model biểu diễn dữ liệu và nghiệp vụ (business logic) cho ứng dụng.

Đây là template thích hợp cho các ứng dụng kiểu cho iPod hay là Mobile Phone. Các template thường dùng Template View . 3D game. Một controller quản lý view chính của ứng dụng. Cung cấp một controller đặc biệt hiển thị một nút bên dưới màn hình. Áp dụng với những ứng dụng sử dụng tới đồ họa.Controller là cầu nối giữa Model và View.1 Các template ứng dụng thường dùng 3. Sự bố trí của một project trong Xcode Sau khi tạo một project mới.CNPM 24 . Framework cơ bản nhất. Áp dụng với những ứng dụng phải sử dụng nhiều view và cần một navigation trung gian giữa chúng.based application Utility application OpenGL ES application Tab bar application Ứng dụng Áp dụng với những ứng dụng chỉ có một view (cảnh).Khóa 50 . 2. Áp dụng với những ứng dụng không thích hợp với bất kỳ template nào ở trên Window-based application Bảng 1.based application Navigation . màn hình project sẽ mở ra: Sinh viên thực hiện: An Thị Hồng .

Frameworks: chứa các framework mà ứng dụng có liên kết. Resources: Các tài nguyên của ứng dụng mà không được biên dịch vào trong source code nhưng được sao chép vào thư mục chương trình khi ứng dụng build lên.CNPM 25 . Other sources sẽ chứa các header tiền biên dịch và hàm main. framework và các tài nguyên của ứng dụng. Products: build target cho ứng dụng Sinh viên thực hiện: An Thị Hồng . Khi muốn thêm một lớp mới vào ứng dụng của mình. lập trình viên sẽ thêm lớp mới của mình vào đây Other sources: các nguồn khác được biên dịch vào ứng dụng.4 Xcode editor Một project đóng gói nguồn. Các thư viện này được liên kết lúc build. Trong một project bao gồm: Classes: Chứa các lớp Objective-C mà ứng dụng cần sử dụng: đối tượng delegate. view controller. Mặc định.Khóa 50 .Hình 1. Các tài nguyên này bao gồm: ảnh. âm thanh. game level hay các file quan trọng khác. và các đối tượng khác người dùng tạo ra.

Nhấn đúp vào biểu tượng ứng dụng trong Finder. trong project mới được tạo ra sẽ chứa một tập file Interface Builder cơ bản.1.2. Interface Builder được đặt trong thư mục <Xcode>/Application với <Xcode> là thư mục gốc cài đặt Xcode.nib hay .Nhấn đúp vào file Interface Builder trong cửa sổ project của Xcode. hoặc trong giao diện Builder chọn File> New.xib. Mở Interface Builder: . Khi muốn tạo thêm các file Interface Builder. .Khóa 50 . Tạo file Interface Builder Khi tạo một project. . 2. Cửa sô “Choose a Template” được mở ra: Sinh viên thực hiện: An Thị Hồng . Xcode sử dụng project template.Nhấn đúp vào file Interface Builder trong Finder có phần mở rộng là . trong hộp thoại Xcode chọn New File.CNPM 26 .6 Interface Builder Interface Builder là trình biên tập đồ họa của Apple để thiết kế và kiểm thử giao diện người dùng. 1.

Các template này xác định tập các đối tượng khởi tạo ban đầu sử dụng trong file giao diện mới được tạo ra.New File Đối với mỗi một file mới được tạo ra. Platform iPhone OS Sản phẩm Template iPhone Application View Window Empty iPad Application View Window Empty Application Mô tả Tạo một file giao diện sử dụng để thiết kế giao diện cho ứng dụng Cocoa Touch. Mỗi template hướng tới một mục tiêu khác nhau.Khóa 50 .5 Interface Builder . Tạo tài liệu để thiết kế thanh thực đơn cho ứng dụng Cocoa Dùng để thiết kế một view trong ưng dụng Cocoa Dùng để thiết kế một cửa sổ trong ứng dụng Cocoa 27 Mac OS X Cocoa Main Menu View Window Sinh viên thực hiện: An Thị Hồng . Người dùng cũng có thể sử dụng template rỗng nếu muốn tự thêm các đối tượng cho tài liệu của mình. người dùng cũng có thể loại bỏ các đối tượng không muốn. Interface Builder cung cấp một số template khác nhau được liệt kê trong bảng sau. Dùng để thiết kế một view trong ưng dụng Cocoa Touch Dùng để thiết kế một cửa sổ trong ứng dụng Cocoa Touch Tạo một file rỗng mà người dùng có thể tùy ý thêm các đối tượng Tạo ra file thích hợp để tạo ứng dụng cho iPad.CNPM . Interface Builder cho phép người dùng chọn một template bắt đầu. Đối với bất kỳ template có sẵn nào.Hình 1. gồm một delegate và một cửa sổ của ứng dụng Tạo một file để thiết kế view cho ứng dụng iPad Dùng dể thiết kế một cửa sổ cho ứng dụng iPad Tạo một file giao diện sử dụng để thiết kế giao diện cho ứng dụng Cocoa. File giao diện này chứa 1 cửa sổ. File giao diện này chứa 1 cửa sổ.

chẳng hạn như cửa sổ. cửa sổ Inspector. view. và thực đơn.Empty Carrbon Application Dialog Main Menu Window Empty Interface Builder Kit Inspector Tạo một file rỗng mà người dùng có thể tùy ý thêm các đối tượng Tạo một file giao diện sử dụng để thiết kế giao diện cho ứng dụng Carbon.Cửa sổ tài liệu: Mỗi tài liệu Interface Builder lưu trữ thông tin về một hoặc nhiều đối tượng người sử dụng muốn tạo ra tại thời gian chạy trong ứng dụng của mình. điều khiển. cửa sổ thư viện. bảng kết nối .2 Các template của Interface Builder 3.Khóa 50 . chẳng hạn như các đối tượng điều khiển được chương trình sử dụng để quản lý các cửa sổ và view của mình. Hầu hết các đối tượng tương ứng với các phần tử hiển thị trên màn hình. File giao diện này chứa 1 cửa sổ. Tạo tài liệu để thiết kế hộp thoại cho ứng dụng Carbon Tạo tài liệu để thiết kế thanh thực đơn cho ứng dụng Carbon Dùng để thiết kế một cửa sổ trong ứng dụng Carbon Tạo một file rỗng mà người dùng có thể tùy ý thêm các đối tượng Tạo tài liệu để thiết kế một Inspector cho Interface Builder plug-in Dùng để thiết kế các phần tử thư viện cho Interface Builder plug-in - Library Bảng 1. Cửa sổ tài liệu Interface Builder cung cấp một số cửa sổ cho phép người dùng hiển thị và chỉnh sửa các đối tượng trong giao diện sử dụng của ứng dụng: cửa sổ tài liệu.CNPM 28 . Ví dụ một cửa sổ tài liệu: Sinh viên thực hiện: An Thị Hồng . Một số đối tượng không tương ứng với các phần tử hiển thị.

Cửa sổ thư viện: Cửa sổ thư viện chứa các đối tượng và các tài nguyên được thêm vào tài liệu Interface Builder.Hình 1. Cửa sổ tài liệu Interface Builder .Khóa 50 . Người dùng có thể kéo một đối tượng nút lên mặt thiết kế như một cửa sổ hoặc view.6. Hình sau cho thấy cửa sổ thư viện với một tập các đối tượng nút Cocoa.CNPM 29 . Sinh viên thực hiện: An Thị Hồng .

7 Cửa sổ thư viện Interface Builder .Cửa sổ Inspector: Cửa sổ Inspector giúp dễ dàng hiển thị và điều chỉnh các cài đặt cho đối tượng hiện đang được chọn.Hình 1.Khóa 50 . Hình sau cho thấy cửa sổ thuộc tính cho một nút Cocoa Sinh viên thực hiện: An Thị Hồng . Sử dụng các biểu tượng chế độ dọc theo phía trên cửa sổ để lựa chọn một pane và hiển thị các cài đặt tương ứng.CNPM 30 .

Bảng điều khiển kết nối: Một kết nối là cách để các thành phần giao diện kết hợp với mã nguồn.CNPM 31 . Đối với tài liệu được sử dụng nền tảng Cocoa và Cocoa Touch.8 Cửa sổ thuộc tính Interface Builder . bảng điều khiển kết nối là một cách nhanh chóng để tạo và quản lý các kết nối cho một đối tượng cụ thể.Khóa 50 . Sinh viên thực hiện: An Thị Hồng .Hình 1.

NeXT Computer và Sun Microsystem phát hành bản đặc tả kỹ thuật chuẩn của hệ thống NEXTSTEP gọi là OPENSTEP. Dennis Ritchie của phòng thí nghiệm AT&T Bell giới thiệu ngôn ngữ lập trình C. ngôn ngữ C mới trở nên phổ biến do trước đó bộ biên dịch cho C chưa phải là sản phẩm thương mại bên ngoài phòng thí nghiệm Bell.1 Ngôn ngữ Objective-C 1.Cox thiết kế nên ngôn ngữ Objective-C. Tuy nhiên phải đến cuối những năm 70. Brad J. Đến đầu những năm 80 của thế kỷ trước.CNPM 32 .9 Bảng kết nối của Interface Builder 1.3 Công cụ lập trình 1.3. Ngôn ngữ này dựa trên một ngôn ngữ tên là SmallTalk-80. Objective-C ở tầng trên của ngôn ngữ C với ý nghĩa là những phần mở rộng đã được bổ sung vào C để tạo thành một ngôn ngữ lập trình mới có thể tạo ra và quản lý đối tượng.Khóa 50 . NeXT Software đăng ký ngôn ngữ Objective-C vào năm 1988 và phát triển thư viện và một môi trường phát triển cho nó tên là NEXTSTEP. Năm 1994. Lịch sử của ngôn ngữ Objective-C Đầu những năm 70 của thế kỷ trước.Hình 1. Sinh viên thực hiện: An Thị Hồng .

Runtime: Ngôn ngữ Objective-C giảm nhẹ tới mức tối thiểu những việc cần làm tại thời gian biên dịch (compile time) và liên kết (link time) để đẩy hết cho lúc chạy (runtime).20/12/1996. hãng máy tính Apple công bố đã giành được NeXT Software. đối tượng và thông điệp a. nó tự động thực hiện các hoạt động như tạo các đối tượng và xác định xem sẽ gọi phương thức nào. id là con trỏ tới cấu trúc dữ liệu đối tượng: typedef struct objc_object { Sinh viên thực hiện: An Thị Hồng . Apple đã tạo ra một môi trường phát triển rất mạnh cho phát triển ứng dụng trên hệ điều hành Mac OS X. (Nó có thể được sử dụng cho cả thể hiện của lớp và chính bản thân đối tượng lớp) . Năm 2007. hệ điều hành thế hệ tiếp theo của Apple.Khóa 50 . Lớp. Apple không cho phép các ứng dụng của bên thứ 3 chạy trên thiết bị này. Tuy nhiên. định danh của đối tượng là một loại dữ liệu đặc biệt: id. Phiên bản môi trường phát triển này của Apple được gọi là Cocoa. Năm 2007 cũng là năm Apple phát hành iPhone. Ban đầu. cùng với Xcode và Interface Builder. mà còn cần một runtime system để thực thi mã biên dịch. *id: Trong Objective-C.0. Đối tượng: Khái niệm đối tượng trong Objective-C không khác so với trong các ngôn ngữ lập trình hướng đối tượng khác như là Java . Apple đã thuê chính các hacker này để viết nên iPhone SDK cho phép các nhà phát triển có thể viết ứng dụng cho iPhone. Điều này có nghĩa rằng ngôn ngữ không chỉ đòi hỏi một trình biên dịch.CNPM 33 . Đối tượng bao gồm các thuộc tính và các phương thức. Nhiều hỗ trợ cho ngôn ngữ Objective-C được tích hợp sẵn. C++ hay C#. Đây là kiểu chung cho bất kỳ loại đối tượng nào kể cả lớp. Apple phát hành bản cập nhật của Objective-C gọi là Objective-C 2. Apple đã thay đổi chiến lược. Bất cứ khi nào có thể. 2. và NEXTSTEP/OPENSTEP trở thành nền móng cơ bản cho OS X. Nhưng sau một thời gian khi một số hacker bẻ khóa được iPhone và viết các phần mềm có thể chạy trên iPhone. các lập trình viên không nhất thiết phải tương tác trực tiếp với runtime. Runtime system hoạt động như một loại hệ điều hành cho ngôn ngữ Objective-C vì nhờ nó mà ngôn ngữ này mới có thể làm việc. b.

Do đó. một đối tượng được xác định bởi địa chỉ của nó. Trình biên dịch ghi lại các thông tin về định nghĩa lớp trong cấu trúc dữ liệu được dùng cho runtime system. Tất cả các đối tượng. tất cả các đối tượng đều chứa biến thành phần isa để xác định xem nó là thể hiện của lớp nào. Thuộc tính isa xác định lớp của đối tượng nghĩa là xác định xem đối tượng đó thuộc loại gì. việc đảm bảo rằng các đối tượng được giải phóng khỏi bộ nhớ khi không còn cần thiết nữa hết sức quan trọng nếu không bộ nhớ ứng dụng sẽ trở nên lớn hơn mức cần thiết. Do đó các đối tượng được xác định kiểu dữ liệu động khi chạy. Khi cần thiết.Khóa 50 . đều thuộc loại id. bất kể biến và phương thức thành phần của nó là gì. được trình bày sau đây. Bất cứ khi nào nó cần. Giống như một hàm hay màng của C. *Xác định kiểu dữ liệu động: Kiểu dữ liệu id có thể đại diện cho tất cả các đối tượng tuy nhiên bản thân nó lại không chứa bất kỳ thông tin nào về đối tượng. Biến isa cũng cho phép các đối tượng tự tìm hiểu về bản thân mình. chương trình cần phải tìm thêm thông tin cụ thể về đối tượng: chứa các dữ liệu kiểu gì. ngoài việc chỉ ra rằng đó là một đối tượng. runtime system có thể tìm thấy chính xác lớp của một đối tượng. id anObject.Class isa. Xác định kiểu dữ liệu động là nền tảng cho ràng buộc động (dynamic binding). có các phương thức nào. Cũng quan trọng để đảm bảo rằng không giải phóng các đối tượng trong khi nó vẫn còn đang được sử dụng. Sinh viên thực hiện: An Thị Hồng . Các hàm của runtime system sử dụng isa để tìm thông tin này khi chạy.CNPM 34 . *Quản lý bộ nhớ: Trong một chương trình Objective-C. } *id. Các đối tượng có cùng các phương thức và các biến thành phần là thành viên của cùng một lớp. Nhưng các đối tượng không hề giống nhau. Bởi vì kiểu dữ liệu id không thể cung cấp thông tin này cho trình biên dịch nên các đối tượng phải có khả năng cung cấp các thông tin này khi chạy.

0 y: 50. c. runtime system lựa chọn phương thức thích hợp từ các phương thức của đối tượng nhận và chạy nó.0] Một thông điệp có thể được lồng trong thông điệp khác. Vì lý do này. *Ràng buộc động (Dynamic Binding): Một khác biệt quan trọng giữa lời gọi hàm và thông điệp là một hàm và các tham số của nó được liên kết với nhau trong mã biên dịch. cần phải gửi cho nó một thông điệp để nó thực hiện một phương thức nào đó của mình.CNPM 35 . nó chỉ đơn giản không gây hiệu ứng gì trong khi chạy.Reference counting . * Gửi thông điệp tới đối tượng nil: trong Objective-C. tên phương thức trong thông điệp còn được gọi là “selector”. điều này hoàn toàn hợp lệ. biểu thức thông điệp được đặt trong dấu ngoặc vuông: [đối_tượng_nhận thông_điệp] Trong mã nguồn. Ví du: [myRectangle setPrimaryColor:[otherRect primaryColor]]. Sinh viên thực hiện: An Thị Hồng . nhưng thông điệp và đối tượng tiếp nhận không thống nhất cho đến khi chương trình đang chạy và tin nhắn được gửi đi. Trong Objective-C. thông điệp chính là tên của một phương thức và các tham số được truyền vào cho nó.Objective-C cung cấp hai môi trường quản lý bộ nhớ để đạt được các mục tiêu này: . Khi một thông điệp được gửi đi. Các phương thức có thể nhận số tham số truyền vào tùy ý. Và để tránh nhầm lẫn có thể đặt tên cho các tham số. Ví dụ: [myRectangle setOriginX: 30.Khóa 50 . Thông điệp (message): * Cú pháp: Để khiến một đối tượng làm gì. không phải khi mã được biên dịch. Tên phương thức trong một thông điệp dùng để chọn phương thức thực thi. Vì vậy. cách nhau bởi dấu “:”. phương thức chính xác được gọi để trả lời một phương thức chỉ có thể được xác định tại thời gian chạy.Garabge collection (không có trên iPhone).

Khi một thông điệp được gửi. Những thông tin này chỉ được đối tượng tiết lộ tại thời gian chạy khi nó nhận được thông điệp (xác định kiểu động).Khóa 50 . d. một runtime messaging rountine sẽ tìm kiếm đối tượng nhận và phương thức có tên trong thông điệp. Nó định nghĩa framework cơ bản cho các đối tượng và tương tác giữa các đối tượng của Objective-C. để tìm ra phương thức thực thi đúng thông điệp.Phương thức chính xác mà một thông điệp gọi sẽ phụ thuộc vào đối tượng nhận. chủ yếu là các thành phần của lớp: . Tính ràng buộc động của phương thức (dynamic binding) với các thông điệp kết hợp chặt chẽ với tính đa hình đa hình tạo nên tính linh hoạt và sức mạnh của ngôn ngữ lập trình hướng đối tượng. *Lớp NSObjects: NSObject là lớp gốc. Các đối tượng khác nhau có thể có các phương thức khác nhau thực thi cùng một lời gọi hàm (tính đa hình). Để thực thi các tác vụ của mình. *Đối tượng lớp: Một định nghĩa lớp chứa nhiều thông loại thông tin. Việc lựa chọn một phương thức thực hiện sẽ xảy ra khi chạy. nên nó không có lớp cha.Code thực thi các phương thức. Sinh viên thực hiện: An Thị Hồng . kiểu trả về và tham số của phương thức đó . Lớp (Class): Lớp định nghĩa một nguyên mẫu cho một loại đối tượng. nó cần phải biết đối tượng đó thuộc lớp nào. lớp mới sẽ bổ sung các biến và phương thức mới hay sửa các phương thức mà nó được kế thừa.Tập các biến thành phần . Những lớp không cần kế thừa các phương thức đặc biệt từ lớp khác có thể là đặt là lớp con của lớp NSObject.Tên của lớp và lớp cha của nó . Đối với trình biên dịch.CNPM 36 . nó khai báo các biến và định nghĩa một tập hợp các phương thức thành phần. Mỗi lớp được tạo ra đều phải là lớp con của một lớp khác và nó kế thừa các phương thức cũng như biến thành phần của lớp này.Khai báo các phương thức.

.Khóa 50 . nó không phải là một thể hiện. Để đối tượng có thể sử dụng được. Tuy nhiên. đối tượng lớp được biểu diễn bằng tên lớp. File thực thi chứa code thực thi của các phương thức của lớp. Nó là một file header của C chuẩn và không chứa bất kỳ dòng code thực thi nào. Trình biên dịch sẽ chỉ tạo ra một đối tượng. một định nghĩa lớp có thể bao gồm các phương thức dành riêng cho các đối tượng lớp gọi là các phương thức tĩnh của lớp. Định nghĩa một lớp Objective-C chia một lớp thành file giao diện (interface) và file thực thi (implementation). đối tượng lớp.m. myRectangle = [Rectangle alloc]. Mặc dù một đối tượng lớp giữ các nguyên mẫu của thể hiện lớp.Những thông tin này được biên dịch và ghi lại trong cấu trúc dữ liệu tạo sẵn cho runtime system. nó thường cần phải được khởi tạo.h> @interface Simple : NSObject{ } Sinh viên thực hiện: An Thị Hồng . Phương thức alloc cấp phát 1 vùng bộ nhớ động cho các biến thành phần của đối tượng mới và khởi tạo tất cả về 0 ngoại trừ biến isa thể hiện với lớp của nó. Đối tượng lớp có quyền truy cập tất cả các thông tin về lớp.CNPM 37 alloc] init]. đại diện cho lớp. *Tạo một thể hiện của lớp: Một chức năng chính của đối tượng lớp là tạo ra các thể hiện mới của lớp đó. Trong mã nguồn. Ví dụ đoạn code sau sẽ yêu cầu lớp Rectangle tạo ra một thể hiện Rectangle và gán nó cho biến myRectangle: id myRectangle. File thực thi có phần đuôi mở rộng là . Đó là chức năng của hàm init thường được gọi ngay sau hàm alloc: myRectangle = [[Rectangle 3. Nó không có các biến của riêng nó và nó không thể tự thực hiện phương thức dành cho thể hiện của lớp. Ví dụ định nghĩa một lớp Simple: File giao diện: Simple.h #import <Foundation/Foundation. File giao diện khai báo các biến và phương thức thành phần.

Ví dụ. Những chỉ thị này phân biệt giao diện của một lớp với phần thực thi của nó. Trình biên dịch sẽ tìm thấy đoạn code thực thi của phương thức trong phần định nghĩa phương thức. *Khai báo và định nghĩa phương thức: Các biến và phương thức thành phần được khai báo trong file giao diện và được định nghĩa trong file thực thi của lớp.h. Phần khai báo không nói gì đến nội dung của hàm.m. Sinh viên thực hiện: An Thị Hồng . lưu ý tới chỉ thị biên dịch @implementation.CNPM 38 .h chứa giao diện của lớp Simple. name). Phần code nằm giữa chỉ thị @interface và @end trong Simple. Phần khai báo chỉ ra cho trình biên dịch biết rằng có một phương thức có tên sayHello có một tham số truyền vào có kiểu NSString và không trả lại gì cả (void). Khai báo một phương thức nghĩa là thông báo cho trình biên dịch biết lớp có phương thức đó nhưng không cung cấp code thực sự cho phương thức đó. trong đoạn code nằm giữa @implementation và @end trong file Simple. Trong file Simple.(void) sayHello: (NSString *) name. phần định nghĩa của phương thức sayHello ở trên: .h” @implementation Simple @end *Chỉ thị biên dịch @interface và @implementation: Trong file Simple. khai báo biến và thuộc tính thành phần.(void) sayHello : (NSString *) name{ NSLog(@”Hello %@”.m @import “Simple. lưu ý tới chỉ thị biên dịch @interface. khai báo lớp.@end File thực thi: Simple.Khóa 50 . Ví dụ một khai báo phương thức: .m chứa phần thực thi của lớp Simple. } *Các phần tử trong file giao diện của lớp: Giao diện của lớp bao gồm các câu lệnh import.

Khóa 50 . các lớp con không kế thừa biến private của lớp cha. private hay protected. Thực thi của lớp cũng quan trọng như là giao diện của nó vậy. Biến public cho phép tất cả các lớp khác đêu truy nhập được vào. protected: Các biến thành phần của lớp có thể là public. Sinh viên thực hiện: An Thị Hồng . Biến private là biến chỉ được sử dụng trong lớp đó mà thôi. private.Hình 1. Biến protected cho phép kế thừa nhưng không cho phép các lớp khác truy nhập vào.CNPM 39 . các lớp khác không thể truy nhập vào biến private của lớp khác. *Các biến thành phần public.10 Cấu trúc file giao diện của một lớp * Các phần tử trong file thực thi của lớp: Giao diện chỉ là một nửa của lớp.

autorelease .11 Cấu trúc file thực thi của một lớp * Sử dụng đối tượng self trong một thông điệp: Thuật ngữ self ám chỉ bản thân đối tượng khi gửi một thông điệp đi và nó cũng đồng thời là đối tượng nhận thông điệp đó.CNPM 40 Mô tả Cấp phát một vùng bộ nhớ cho đối tượng mới và gán retain count của đối tượng bằng 1 Đưa đối tượng nhận thông điệp này vào autorelease pool Giải phóng bộ nhớ cho đối tượng có retain count bằng 0 Giảm retain count của đối tượng đi 1 Tăng retain count của đối tượng lên 1. Mặc dù đến phiên bản OS X 10. trả về một đối tượng id .5. Nó dùng để chỉ đối tượng hiện thời tương tự như đối tượng this trong Java.retain . Cocoa đã có tùy chọn sử dụng garbage collection tự động nhưng tùy chọn này vẫn chưa có trên iPhone. Bảng sau tổng kết các phương thức quản lý bộ nhớ của Objective-C: Phương thức + alloc .dealloc . khi lập trình cho iPhone.copy Sinh viên thực hiện: An Thị Hồng . *Quản lý bộ nhớ sử dụng retain và release Không giống như Java hay C#.release .Hình 1. lập trình viên phải tự quản lý bộ nhớ vì trong iPhone không có bộ gom rác (garbage collection).Khóa 50 .

CNPM 41 . Ví du: . gán đối tượng objSimple cho autorelease pool. Khi phương thức được thực hiện xong. Tuy nhiên. Ví dụ: . Sử dụng autorelease và chấp nhận autorelease pool ở chế độ mặc định làm cho việc quản lý bộ nhớ trở nên dễ dàng. [pool release].Bảng 1.(void) sayHelloTom { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]. Simple *objSimple = [[[Simple alloc] autorelease] init]. Chỉ có một cách giải quyết là tự quản lý đối tượng NSAutoReleasePool.3 Các phương thức quản lý bộ nhớ của Objective-C *Quản lý bộ nhớ sử dụng Autorelease Việc tự quản lý retain count có thể nhiều lúc gây ra nhầm lẫn hay lỗi. } *Thuộc tính: Sinh viên thực hiện: An Thị Hồng .(void) sayHelloTom { Simple *objSimple = [[[Simple alloc] init] autorelease]. [objSimple sayHello:@"Tom"]. Phương thức autorelease của đối tượng NSObject sẽ giúp quản lý retain count. autorelease pool được giải phóng và do đó thể hiện của lớp Simple objSimple cũng được giải phóng. có vấn đề nảy sinh: các đối tượng kéo thời gian tồn tại của release pool.Khóa 50 . } Hàm sayHelloTom sẽ cấp phát một vùng bộ nhớ cho thể hiện của lớp Simple và sau đó gọi hàm autorelease. Phương thức autorelease sử dụng lời gọi release pool để quản lý tham chiếu của đối tượng. [objSimple sayHello:@"Tom"].

Objective-C 2. Tạo thuộc tính bằng cách sử dụng chỉ thị biên dịch @property. không thể thiết lập giá trị cho nó biến thành phần có hàm getter và setter (mặc định) Hàm setter sẽ gán biến thành phần cho một đối tượng và gọi hàm retain. Con trỏ trỏ đến không gian bộ nhớ. Thuộc tính là các “phím tắt” để tạo một phần tử truy nhập vào biến thành phần.@finall để bắt các ngoại lệ. Quản lý bộ nhớ khi lấy ra hay gán một giá trị cho biến thành phần là một việc không dễ dàng. Thay đổi không gian bộ nhớ một biến chỉ tới mà không giữ lại (retain) hay giải phóng (release) thường gây ra lỗi.4 Property attribute *Điều khiển ngoại lệ: Điều khiển ngoại lệ trong Objective-C tương tự như Java và C++. Một chỉ thị thuộc tính cũng có một số thuộc tính được liệt kê trong bảng sau: Property Attribute assign copy nonatomic readonly readwrite retain Description Hàm setter sẽ gán biến thành phần cho đối tượng Hàm setter sao chép đối tượng cho biến thành phần Trả lại gia trị mà không cần gọi retain hay autorelease trên đối tượng biến thành phần chỉ được đọc. Bảng 1. Objective-C có khối @try .Sử dụng đối tượng Objective-C tức là thao tác với con trỏ. @property khai báo một thuộc tính.CNPM 42 .@catch.0 giúp cho việc này trở nên dễ dàng hơn sử dụng thuộc tính. @synthesize nói cho trình biên dịch biết phải sinh ra một phần tử truy nhập và @dynamic thông báo cho trình biên dịch biết là người dùng sẽ cung cấp hàm truy nhập. Sinh viên thực hiện: An Thị Hồng .Khóa 50 . Thay đổi một biến thành phần có kiểu thừa kế từ NSObject thực chất là thay đổi không gian bộ nhớ nó chỉ vào.

b.BSD networking API . chọn cách truyền tốt nhất. CFURL là các API xây dựng trên nền tảng C. Chúng hỗ trợ các Sinh viên thực hiện: An Thị Hồng .Khóa 50 . . thuộc framework Foundation. lập trình viên không phải tự chọn khi nào sử dụng WiFi hay là sóng điện thoại. như là printer hay file server. .3. Download tài nguyên sử dụng URL : Core Foundation URL Access Utilities (CFURL) và NSURL API (xây dựng trên nền CFURL). a. đọc. . Các giao diện sẽ tự động truy nhập vào thiết bị phần cứng ở dưới. . Khi sử dụng các giao diện này. cung cấp các trừu tượng (abstraction) cho nhiều CFNetwork API.4 Lập trình mạng 1. Tương tác với Web và File Servers sử dụng HTTP và FTP Streams: Nếu ứng dụng của cần tương tác với web server hay FTP server vượt qua khả năng của CFURL và NSURL.NSNetService và NSNetServiceBrowser là các lớp trong Foundation framework giúp quản lý các dịch vụ mạng Bonjour . NSURL là các API xây dựng trên nền tảng Objective-C. Tổng quan: iPhone OS bao gồm một số framework và thư viện cho phép xây dựng các ứng dụng có khả năng truy nhập mạng. . như là kết hợp socket với run loop (vòng lặp chạy) và liên lạc với HTTP và FTP server. . cung cấp các phương thức tiện lợi không phụ thuộc vào hệ thống để tạo. update.Core Foundation là framework xây dựng trên nền tảng C. Lập trình viên có thể truy nhập vào các dịch vụ và giao thức chính thông qua Foundation và Core Foundation cũng như là thông qua CFNetwor và BSD Socket.CFNetwork là framework xây dựng trên nền tảng C cho phép ứng dụng thi hành nhiều tác vụ network. khá là quen thuộc với những người đã sử dụng socket trong các nền tảng khác. cung cấp cách thức đơn giản để download tài nguyên từ web server hay FTP server.1.cung cấp các hàm socket ở mức thấp.một phần của libSystem. và tự động chuyển đổi từ cái này sang cái khác nếu cần. và xóa các tài nguyên URL.CFNetServices là API xây dựng trên nền tảng C cho phép phát hiện hay đăng ký dịch vụ mạng Bonjour. nên sử dụng CFHTTPStream và CFFTPStream API.CNPM 43 .Foundation là framework xây dựng trên nền tảng Objective-C. thuộc framework Core Foundation.

Lập trình mạng với CFNetwork CFNetwork là framework trong Core Services framework. nhưng hang Apple khuyên nên tránh dùng chúng. Các trừu tượng giúp thực thi nhiều tách vụ liên quan đến mạng như là : . HTTP cookie và request header management. Các khái niệm CFNetwork là một framework ở mức thấp.request HTTP và FTP phức tạp như là HTTP GET và POST. .Để học về lập trình BSD đọc UNIX Socket FAQ.Các ứng dụng mạng cho Mac OS X và ứng dụng mạng cho iPhone OS có thể sử dụng cùng một giao diện lập trình mạng. Đăng ký và phát hiện dịch vụ mạng Có thể đăng ký hay phát hiện một dịch vụ mạng sử dụng Bonjour.CNPM 44 . Liên lạc sử dụng socket: Nếu ứng dụng sử dụng socket. đọc thư mục FTP và tải file lên FTP. a.Làm việc với HTTP. giao diện trừu tượng socket chuẩn cung cấp các đối tượng để đơn giản hóa các tác vụ Sinh viên thực hiện: An Thị Hồng . Nếu giao tiếp trực tiếp với socket một số khả năng mạng của iPhone OS không làm việc (ví như VPN On Demand). Để làm điều đó. resolving và browsing Bonjour services. authenticating HTTP và HTTPS server . . hiệu suất cao cho phép người dùng khả năng điều khiển chi tiết ngăn xếp giao thức. iPhone OS cung cấp giao diện lập trình tích hợp socket với runloop trong Core Foundation cũng như là trực tiếp truy nhập vào BSD socket.Khóa 50 . cung cấp một thư viện các trừu tượng cho giao thức mạng. d. c.Làm việc với FTP server .Mặc dù giao diện lập trình mạng cho BSD (POSIX) có trong iPhone OS. 2.Làm việc với BSD socket . .Publishing.Tạo các kết nối mã hóa sử dụng SSL hay TLS. Nên sử dụng API được cung cấp bởi CFStream Socket Additions. Nó là một mở rộng của BSD socket.Resolving DNS host . . sử dụng CFNetServices trên nền C hoặc NSNetServices API trên nền Objective-C.

Có một số ưu điểm của việc sử dụng CFNetwork thay vì sử dụng Cocoa framework NSURL: CFNetwork tập trong nhiều hơn vào giao thức mạng. cũng như là truyền dữ liệu qua HTTP hay FTP.CNPM 45 . do đó. NSURL yêu cầu sử dụng Objective-C. lập trình viên có thể sử dụng các giao thức mạng mà không cần phải sử dụng thread. CFNetwork Infrastructure CFNetwork dựa trên 2 giao diện lập trình là một phần của Core Foundation frame work. Cũng như CFNetwork dựa trên BSD socket.12 CFNetwork và các lớp phần mềm khác trong Mac OS X b.Khóa 50 . Thêm nữa.như giao tiếp với máy chủ FTP và HTTP hoặc giải quyết DNS host. NSURL tập trung nhiều hơn vào truy nhập dữ liệu. CFNetwork cũng cung cấp một số đối tượng giúp sử dụng các giao thức mạng mà không cần thực thi chi tiết. Ví dụ có thể sử dụng giao thức FTP mà không cần thực thi tất cả giao diện lập trình CFFTP. Nó tích hợp run loop. Thêm nữa. NSURL là một trong những lớp đó. Web Kit là tập các lớp Cocoa để hiển thị nội dung web trong cửa sổ. được sử dụng để liên lạc với server sử dụng giao thức Internet chuẩn. Hình 1. c. * CFSocket API: Sinh viên thực hiện: An Thị Hồng . trong các ứng dụng của mình. CFNetwork dựa trên các BSD socket. Các lớp này đều ở mức high level và tự thực thi hầu hết chi tiết của giao thức mạng. CFSocket và CFStream. Khi nào sử dụng CFNetwork CFNetwork có một số ưu điểm so với BSD socket. CFNetwork cung cấp nhiều khả năng cấu hình hơn NSURL. một số lớp Cocoa cũng dựa trên CFNetwork.

CFSocket là một trừu tượng của BSD socket. Stream là một dãy byte được truyền tuần tự qua đường truyền. Cả 2 loại stream đều tuân theo các quy ước lập trình của Core Foundation. Stream chỉ được truyền theo một hướng nên nếu muốn liên lạc 2 chiều thì phải tạo ra 2 stream: input stream (để đọc) và output stream (để ghi). Để tạo đối tượng CFSocket. Nó cho phép kết nối với socket khác (local hay thông qua mạng) và gửi dữ liệu cho các socket đó. có thể gọi hàm CFSocketCreate hay thông qua một BSD socket bằng cách sử dụng hàm CFSocketCreateWithNative. * CFStream API Đọc và ghi stream là cách thức đơn giản để trao đổi dữ liệu đa phương tiện theo cách không phụ thuộc vào thiết bị phần cứng. Ngoại trừ những stream lấy nguồn từ file.Khóa 50 . Socket thường hay sử dụng nhất là BSD socket. nó không thể lấy lại được. không thể di chuyển đến vị trí bất kì trong stream. trong file hay trên mạng (sử dụng socket) và khi sử dụng stream. Sau đó. Các stream có thể lấy nguồn từ dữ liệu có sẵn trong bộ nhớ.Socket là mức cơ bản nhất của giao tiếp mạng. nó tích hợp socket vào run loop. CFSocket không bị giởi hạn bởi loại socket dựa trên luồng mà nó có thể điều khiển bất kỳ loại socket nào. CFSocket cung cấp hầu hết các chức năng của BSD socket. CFStream được xây dựng trên CFSocket và là nền tảng cho CFHTTP và CFFTP.CNPM 46 . tạo nguồn run-loop sử dụng hàm CFSocketCreateRunLoopSource và “đẩy” nó vào run loop sử dụng hàm CFRunLoopAddSource => cho phép hàm CFSocket callback có thể chạy bất cứ khi nào đối tượng CFSocket nhận được 1 thông điệp. không phải tất cả dữ liệu đều cần phải tải vào bộ nhớ một lần. Socket hoạt động giống như buồng điện thoại. Sinh viên thực hiện: An Thị Hồng . CFStream là một giao diện lập trình cung cấp một trừu tượng cho các stream này với 2 đối tượng CFType mới: CFReadStream và CFWriteStream. sau dữ liệu stream đã được truyền đi.

Hàm callback (tự viết) được gọi khi có thể đọc và ghi mà không bị chặn. Các hàm CFStream để đọc hay ghi stream sẽ chặn tiến trình hiện tại cho đến khi nào ít nhất 1 byte dữ liệu được đọc hay ghi. Thuộc tính của stream là tất cả thông tin về stream như là nguồn.Khóa 50 . Người dùng có thể thiết lập một “từ điển” chứa thông tin SSL của stream. file hay socket) và thiết lập các tùy chọn của đối tượng đó.13 Cấu trúc CFStream API Sử dụng stream để đọc và ghi dữ liệu: . Các khái niệm CFNetwork API * CFFTP API: Sinh viên thực hiện: An Thị Hồng . stream cần được đóng và giải phóng. như là mức độ bảo mật hay chữ ký cá nhân. . Để tránh ghi hay đọc stream khi stream bị chặn (đóng) sử dụng phiên bản không đồng bộ của hàm và xếp lịch stream trên run loop. đây không phải là một phần của dữ liệu được đọc ghi.Tạo một đối tượng stream bằng cách chỉ rõ loại (bộ nhớ. lấy thông tin của stream thông qua các thuộc tính của nó. mà chỉ là thông tin về bản thân stream đó thôi. Thêm nữa.CNPM 47 . CFStream có giao thức SSL (Secure Sockets Layer) được xây dựng sẵn.Hình 1. Khi không cần sử dụng nữa. đích.Mở stream để ghi hay đọc Khi stream đang tồn tại. Sau đó nó được truyền qua stream như là thuộc tính kCFStreamPropertySSLSetting khiến stream trở thành một SSL stream. d.

Sử dụng CFFTP API. PUT. Stream đọc và ghi FTP có thể thực thi các hàm: . POST. Bằng cách thiết lập của FTP Stream. * CFHTTP API Để gửi và nhận thông điệp HTTP. gửi trả về một chuỗi. sử dụng hàm CFReadStreamRead và cung cấp một ánh xạ tới stream đọc.CNPM 48 . được trả lại khi stream đọc FTP được tạo ra. Để đọc từ stream.Liên lạc với server FTP trở nên rất đơn giản khi sử dụng CFFTP. Yêu cầu thường là yêu cầu file.Xác định URL: ví dụ http://www. Quá trình này lặp lại nhiều lần khi cần thiết. HEAD. như là 1 webpage. Ví dụ. có thể tạo ra stream đọc FTP (để download) và stream ghi FTP (để upload). Yêu cầu này sẽ được chuyển thành luồng byte. GET.apple. nếu server mà khi kết nối stream vào yêu cầu username và password. CFHTTP là trừu tượng của giao thức HTTP. Sau đó.Xác định cách thức yêu cầu: OPTIONS. lập trình có thể thích ứng các stream cho một ứng dụng cụ thể.. DELETE.Tạo một thư mục trên FTP server FTP stream làm việc giống như các CFNetwork stream khác.Download file từ FTP server .Upload file lên FTP server . Để tạo một thông điệp yêu cầu của HTTP cần phải làm các việc sau: . gọi hàm CFReadStreamOpen. Server trả lời.Download thư mục trên FTP server .com Sinh viên thực hiện: An Thị Hồng . Sau đó gọi hàm CFReadStreamGetError vào bất kỳ lúc nào để kiểm tra trạng thái của stream. cần phải thiết lập các thuộc tính tương ứng để stream có thể làm việc CFFTP stream có thể được sử dụng đồng bộ hay không đồng bộ. TRACE hay CONNECT . yêu cầu được gửi cho server. Hàm CFReadStreamRead "làm đầy" buffer với output từ FTP server. CFReadStreamRef. Client tạo một yêu cầu. Ví dụ. Để mở một kết nối tới FTP server cần phải chỉ rõ khi nào stream đọc FTP được tạo ra. sử dụng CFHTTP API. HTTP là giao thức yêu cầu/đáp ứng giữa client và server.Khóa 50 . tạo một stream đọc FTP bằng cách gọi hàm CFReadStreamCreateWithFTPURL.

Tạo đối tượng CFHost . CFHost tương thích với IPv4 và IPv6. Đối tượng Sinh viên thực hiện: An Thị Hồng .0\r\nUser-Agent: UserAgent\r\nContent-Length: 0\r\n\r\n Tổng hợp từ luồng byte ngược với phân tích thành luồng byte. Ví dụ. tên hay thông tin có thể lấy được của host . . Để thực thi Bonjour. CFNetwork cung cấp tất cả các hàm cần thiết để lấy được loại dữ liệu. và các thông tin có thể lấy được. CFNetServices API định nghĩa 3 loại đối tượng: CFNetService. địa chỉ. như là MyUserAgent.Xác định HTTP version: ví dụ version 1.Xác định phần thân của thong điệp Sau khi thông điệp đã được cấu trúc hóa. luồng byte thô nhận được từ client hay server được khôi phục lại trạng thái ban đầu. * CFHost API CFHost API chứa các thông về host như là: tên. hàm CFStream : CFStreamCreatePairWithSocketToCFHost sẽ tạo một đối tượng CFStream trực tiếp từ đối tượng CFHost.CNPM 49 .Bắt đầu phân tích đối tượng CFHost . và giá trị của nó.Hủy đối tượng CFHost khi đã làm việc xong với nó.Lấy thông tin về địa chỉ.1 .. Với tổng hợp từ luồng byte. phân tích nó thành luồng byte. HTTP version.Khóa 50 .0 hay 1. Quá trình thu thập trông tin về host được gọi là sự phân tích Sử dụng CFHost giống như là sử dụng CFStream: .Xác định phần đầu của thông điệp bằng cách chỉ rõ tên header. CFNetServiceBrowser và CFNetServiceMonitor. như là UserAgent. header. CFHost gắn kết chặt chẽ với các phần còn lại của CFNetwork. URL. lúc này yêu cầu có dạng tương tự như sau: GET / HTTP/1. và thân từ thông điệp đã được phân tích thành luồng byte. * CFNetServices API CFNetServices API được sử dụng khi cần dịch vụ mạng Bonjour để đăng ký hay phát hiện các dịch vụ Bonjour.

= Tham số kCFAllocatorDefault chỉ ra rằng bộ cấp phát bộ nhớ mặc định hiện tại của hệ thống được sử dụng để cấp phát bộ nhớ cho stream. Nó bao gồm tất cả các thông tin cần thiết cho máy khác có thể resolve server đó. * CFNetDiagnostics API Ứng dụng kết nối vào mạng phụ thuộc vào sự kết nối ổn định.Physical connection failure: Hỏng kết nối do lý do vật lý (cáp không được cắm vào) .Khóa 50 . Và đối tượng CFNetServiceMonitor được sử dụng để giám sát thay đổi của đối tượng CFNetService. Mở một stream khiến cho stream đó giữ được các tài nguyên hệ thống mà nó cần. như là printer or a file server. nó sẽ gây ra một số vấn đề với ứng dụng. loại. Bằng cách làm theo CFNetDiagnostics API. domain và cổng. có thể mở stream đọc. e. ví dụ như mô tả file (cần thiết để mở một file) Ví dụ mở một stream đọc: if (!CFReadStreamOpen(myReadStream)) { CFStreamError Sinh viên thực hiện: An Thị Hồng .Configuration failure (cấu hình proxy không đúng).Network failure (DNS hay DHCP server không còn respond) . Tham số fileURL chỉ ra tên của file mà stream đọc sẽ đọc. người sử dụng có thể tự chuẩn đoán các vấn đề liên quan tới mạng như là: . CFNetwServiceBrowser là một đối tượng được sử dụng để phát hiện domain and dịch vụ mạng trong domain. Làm việc với Stream * Làm việc với stream đọc Để tạo một stream đọc: CFReadStreamRef myReadStream CFReadStreamCreateWithFile(kCFAllocatorDefault.CFNetService biểu diễn một dịch vụ mạng đơn lẻ.CNPM myErr = 50 . Khi network failure được chuẩn đoán. Khi stream đã được tạo ra. Nếu mạng bị "rớt". fileURL). CFNetDiagnostics hướng dẫn người dùng sửa lỗi. như là tên.

hay kCFStreamStatusErrorOccurred nếu quá trình mở đã hoàn tất nhưng bị hỏng. kCFStreamStatusOpen nếu quá trình mở đã hoàn tất. ví dụ trên sẽ gọi hàm CFReadStreamGetError để lấy về thông tin của lỗi được biểu diễn trong CFStreamError gồm 2 giá trị: mã domain và mã lỗi. nên hàm CFReadStreamOpen và CFWriteStreamOpen tránh bị chặn bằng cách trả lại TRUE biểu thị rằng quá trình mở stream đã bắt đầu. gọi hàm CFReadStreamGetStatus và CFWriteStreamGetStatus --> trả về kCFStreamStatusOpening nếu quá trình mở vẫn đang được xử lý. } } Hàm CFReadStreamOpen trả lại TRUE nếu thành công. // An error has occurred.CFReadStreamGetError(myReadStream). Mở một stream có thể là một quá trình tốn nhiều thời gian.Khóa 50 .error as a UNIX errno.CNPM 51 . if (myErr. } else kCFStreamErrorDomainMacOSStatus) { if (myErr. FALSE nếu thất bại. Sinh viên thực hiện: An Thị Hồng .error as a MacOS error code. OSStatus macError = (OSStatus)myErr. Để kiểm tra trạng thái của quá trình mở.error. // Check other error domains.h kCFStreamErrorDomainHTTP -> mã lỗi là giá trị được định nghĩa trong CFStreamErrorHTTP enumeration.domain == // Interpret myErr. Ví dụ: kCFStreamErrorDomainPISIX -> mã lỗi là giá trị lỗi của UNIX kCFStreamErrorDomainMacOSStatus -> mã lỗi là giá trị OSStatus được định nghĩa trong MacErrors. Mã domain biểu thị cách thức mã lỗi được biên dịch. Nếu CFReadStreamOpen trả lại FALSE.domain == kCFStreamErrorDomainPOSIX) { // Interpret myErr.

while (!done) { CFTypeRef bytesWritten = CFWriteStreamWrite(myWriteStream. if (myErr. strlen(buf)).CNPM 52 .error as a MacOS error code. } } UInt8 buf[] = "Hello.domain == kCFStreamErrorDomainPOSIX) { // Interpret myErr. fileURL).Khóa 50 . UInt32 bufLen = strlen(buf). if (!CFWriteStreamOpen(myWriteStream)) { CFStreamError myErr = CFWriteStreamGetError(myWriteStream). Ví dụ tạo và sử dụng stream ghi: CFWriteStreamRef myWriteStream = CFWriteStreamCreateWithFile(kCFAllocatorDefault. Sinh viên thực hiện: An Thị Hồng .error as a UNIX errno. buf. if (bytesWritten < 0) { CFStreamError error = CFWriteStreamGetError(myWriteStream).error.*Làm việc với stream ghi: Làm việc với stream ghi tương tự với stream đọc. } else if (myErr. Điểm khác biệt chính là hàm CFWriteStreamWrite không trả về lượng byte được truyền vào cho nó mà trả lại số byte nó thực sự ghi. // Check other error domains. OSStatus macError = (OSStatus)myErr.domain == kCFStreamErrorDomainMacOSStatus) { // Interpret myErr. // An error has occurred. world".

} } CFWriteStreamClose(myWriteStream).reportError(error). đặc biệt là với stream dựa trên socket. } else if (bytesWritten == 0) { if (CFWriteStreamGetStatus(myWriteStream) == kCFStreamStatusAtEnd) { done = TRUE. buf + bytesWritten. * Ngăn không cho bị chặn (blocking) khi làm việc với stream Khi làm việc với stream. myWriteStream = NULL. thường xuyên xảy ra trường hợp dữ liệu truyền mất nhiều thời gian. CFRelease(myWriteStream).Khóa 50 .CNPM 53 . Nếu stream được sử dụng theo cách đồng bộ thì toàn bộ ứng dụng sẽ bị buộc phải chờ cho đến khi dữ liệu được truyền Sinh viên thực hiện: An Thị Hồng .bytesWritten. // Figure out what went wrong with the write stream CFStreamError error = CFWriteStreamGetError(myWriteStream). bufLen). memmove(buf. reportError(error). } } else if (bytesWritten != strlen(buf)) { // Determine how much has been written and adjust the buffer bufLen = bufLen .

CNPM 54 . trong một chương trình. Vì vậy cần phải có một phương pháp để ngăn ngừa tình trạng bị chặn. Ứng dụng cho phép chạy nhiều thread có 2 ưu điểm quan trọng: Sinh viên thực hiện: An Thị Hồng . cần thiết để quản lý việc thực thi code.3. 1. Tuy nhiên. chỉ có một thread được thực hiện. Ở mức hệ thống. không thể tác đồng gì lên ứng dụng. Về lập trình thread a. có thể tồn tại một hay nhiều thread được sử dụng để thực thi các tác vụ khác nhau đồng thời hay gần như đồng thời. Cấu trúc cấp hạt nhân phối hợp các sự kiện và lập lịch ưu tiên cho các thread với một trong các core có sẵn. lập kế hoạch cho các thread và tạm thời ngắt chúng khi cần thiết để cho phép thread khác chạy. Hệ thống tự nó quản lý các thread này. Thread đó bắt đầu và kết thúc với main rountine và chuyển từ phương thức này sang phương thức khác để thực hiện hành vi tổng thể.Sử dụng một run-loop: Đăng ký để nhận được các sự kiện liên quan đến stream và lập lịch stream trên một run loop. Trong một ứng dụng hoạt động không đồng thời. . hàm gọi lại (tự viết) sẽ được gọi. Đối với stream ghi. Trong thời gian đó. xác định trước khi nào stream có thể ghi mà không bị chặn trước khi ghi vào stream.Khóa 50 .5 MultiThreading 1.Polling: đối với stream đọc. Ngược lại. Xét độ về góc độ kỹ thuật thì thread là sự kết hợp giữa cấu trúc dữ liệu cấp hạt nhân và ứng dụng. Khi một sự kiện liên quan đến stream xảy ra. Có hai cách để ngăn bị chặn khi đọc hoặc vào một đối tượng CFStream: . ứng dụng hoạt động đồng thời bắt đầu với một thread và add thêm các thread khi cần thiết. xác định trước có byte để đọc trước khi đọc từ stream. Cấu trúc cấp ứng dụng gồm một ngăn xếp chứa lời gọi hàm và các cấu trúc ứng dụng cần để quản lý và sử dụng các thuộc tính và trạng thái của thread.xong. các chương trình chạy cạnh nhau và được hệ thống phân phát cho thời gian thực hiện tùy thuộc vào chương trình đó cần bao nhiêu thời gian thực hiện và thời gian thực hiện của các chương trình khác. Mỗi một thread mới có start rountine của riêng nó và chạy độc lập với mã trong main rountine của chương trình chính. Thread là gì? Thread là cách thức tương đối nhẹ để thực hiện nhiều tác vụ cùng lúc trong một ứng dụng.

giúp cho chương trình có thể tăng số lượng công việc làm được trong một khoảng thời gian.. Nếu có 2 thread cố gắng thao tác trên cùng một cấu trúc dữ liệu tại cùng một thời điểm.Khóa 50 . thread đó phải làm mọi thứ. chương trình sẽ ngừng áp ứng các sự kiện cũng như cập nhật cửa sổ. thread cũng mang đến các vấn đề tiềm tàng. thread không phải là liều thuốc chữa bách bệnh cho vấn đề hiệu suất thực thi của chương trình. Một yếu tố khác cần xem xét là liệu có cần thread hay xử lý đồng thời. Thread giải quyết vấn đề làm thế nào để thực thi nhiều tác vụ đồng thời trong cùng một xử lý.Multiple thread tăng thời gian thực hiện thực sự trên hệ thống đa lõi. Nếu không hiểu đầy đủ ý nghĩa của việc mình đang làm. lập trình viên có thể dễ dàng gặp các vấn đề về đồng bộ hóa hay thời gian. Sinh viên thực hiện: An Thị Hồng . Vì các thread trong một ứng dụng chia sẻ cùng một không gian bộ nhớ. chúng có quyền truy suất vào tất cả các cấu trúc dữ liệu giống nhau. Lựa chọn thay thế thread Thread là cách ở mức tương đối thấp và phức tạp để hỗ trợ xử lý đồng thời trong chương trình. Các thread có thể có thể thực hiện tác vụ khác nhau một cách đồng thời trên các lõi xử lý khác nhau. Cùng với các lợi ích. và thực hiện tất cả các tính toán cần thiết. Nếu tình trạng này xảy ra đủ lâu. thread giúp tăng hiệu suất của một số chương trình. Với ứng dụng chỉ có một thread. người dùng có thể nghĩ rằng chương trình bị treo và cố gắng tắt nó. b. một thread có thể ghi đè lên thay đổi của thread kia gây lỗi chương trình. Tuy nhiên vấn đề này có thể dễ dàng được giải quyết nếu chuyển công việc tính toán trên sang một thread riêng biệt. Vậy. Với các máy tính đa lõi phổ biến hiện nay. điều gì xảy ra khi một trong các tính toán cần nhiều thời gian để hoàn thành? Trong khi việc tính toán vẫn được thực hiện. Tuy nhiên. cập nhật cửa sổ ứng dụng. Mỗi thread phải phối hợp hành động của nó với các thread khác để ngăn nó khỏi làm hỏng thông tin trạng thái của chương trình. Có nhiều đường thực thi trong ứng dụng tương đương với việc làm tăng độ phức tạp cho code.Multiple thread giúp tăng khả năng đáp ứng của ứng dụng . mức độ nghiêm trọng trong đó có thể là từ những thay đổi nhỏ cho đến làm cho toàn bộ chương trình bị sụp đổ. Vấn đề của việc chỉ có duy nhất một thread là nó chỉ có thể làm một việc một lúc.CNPM 55 . Nó phải đáp ứng các sự kiện. khi đó main thread của chương trình vẫn được tự do để đáp ứng các tương tác của người dùng một cách kịp thời.

Idle-time notificaitons cho phép người lập trình có thể thực hiện nhiệm vụ một thời điểm ứng dụng “nhàn rỗi”. Thread cũng gây ra sự tiêu tốn về bộ nhớ và CPU time.5. Để yêu cầu một idle-time notification. Với GCD. Hàng đợi sẽ làm trễ việc nhận đối tượng thông báo cho đến khi vòng lặp (run loop) nhàn rỗi. Bảng này bao gồm cả công nghệ thay thế cho thread (chẳng hạn như các đối tượng hoạt động và GCD) và lựa chọn thay thế được hướng tới hiệu quả sử dụng single thread mà chương trình đã có Công nghệ Đối tượng hoạt (Operation objects) Mô tả động Được giới thiệu trong Mac OS X v10. Grand Central Dispatch Được giới thiệu trong Mac OS X v10. đối tượng hoạt động là wrapper cho một tác vụ thường được thực hiện trên thread thứ hai. Hàng đợi đưa vào tài khoản số lượng các lõi sẵn dùng và tải xuống để thực hiện tác vụ hiệu quả hơn so với tự làm bằng thread Idle-time notificaitons Đối với tác vụ tương đối ngắn và có mức ưu tiên thấp. Các đối tượng này thường được sử dụng cùng với một đối tượng hàng đợi quản lý việc thực thi của các đối tượng hoạt động trên một nhiều thread. Bảng sau liệt kê một số lựa chọn thay thế thread. Grand Central (GCD) Dispatch là một thay thế khác cho thread khiến người lập trình tập trung vào các nhiệm vụ cần thực hiện hơn là quản lý thread.Có những trường hợp có một số công việc không được thực hiện đồng thời. Cocoa sử dụng đối tượng NSNotificationQueue để hỗ trợ idle-time notification. Wrapper này giấu những khía cạnh quản lý thread để thực hiện tác vụ giúp lập trình viên tập trung vào bản thân các tác vụ. Hàng đợi này sẽ điều khiển việc lập lịch cho các tác vụ trên một thread thích hợp.Khóa 50 .CNPM 56 . Asynchronous functions Các giao diện hệ thống bao gồm nhiều chức năng không đồng bộ cung cấp tính năng xử lý đồng thời tự động. Các API này có thể sử dụng trình nền hệ thống và quy trình hoặc tạo ra các chủ đề tùy chỉnh để thực hiện nhiệm vụ Sinh viên thực hiện: An Thị Hồng .6. cần xác định nhiệm vụ muốn thực hiện và thêm nó vào một hàng đợi. đăng một thông báo cho đôi tượng mặc định NSNotificationQueue sử dụng tùy chọn NSPostWhenIdle.

hãy tìm chức năng cung cấp không đồng bộ và xem xét hành vi sử dụng chúng thay vì sử dụng các chức năng tương đương đồng bộ trên một sợi tùy chỉnh. Hỗ trợ thread * Các loại thread: Công nghệ Cocoa threads Mô tả Cocoa thực thi thread sử dụng lớp NSThread. Thay vào đó. Nếu thread không phải đang chạy. sẵn sàng.6 Các loại thread Ở cấp độ ứng dụng. Sau khi bắt đầu một thread. Mặc dù tiêu tốn tài nguyên hơn so với thread. tất cả các thread hoạt động về cơ bản giống như trên các nền tảng khác.Khóa 50 . Đây là lựa chọn tốt nhất dành cho ứng dụng không phải là ứng dụng Cocoa.5 Các công nghệ có thể sử dụng thay thế thread trong ứng dụng c. nó hoặc bị chặn Sinh viên thực hiện: An Thị Hồng . Timers có thể được sử dụng trong thread chính của chương trình để thực thi các tác vụ biết trước một cách thường kỳ. thread ở trong một trong ba trạng thái chính: chạy. hoặc bị chặn. Process có thể được sử dụng cho tác vụ đòi hỏi một số lượng đáng kể bộ nhớ hoặc phải được thực hiện bằng cách sử dụng đặc quyền root.Timers Separate processes của họ và trả lại kết quả cho bạn.CNPM 57 POSIX threads Muiltiprocessing Services . tạo ra một process riêng biệt có thể có ích trong trường hợp tác vụ chỉ liên quan tiếp tuyến đến chương trình. bạn nên sử dụng lớp NSThread hoặc POSIX Bảng 1. Công nghệ này chỉ có sẵn trong Mac OS X và nên tránh sử dụng. (Việc thực hiện thực tế là không thích hợp bởi vì nó được chia tách từ mã của bạn) Khi bạn thiết kế ứng dụng của bạn. Bảng 1. Cocoa cũng cung cấp thêm một số phương thức trong lớp NSObject để tạo một thread mới và thực thi code trên thread đã chạy POSIX đề cung cấp một giao diện dựa trên C cho việc tạo thread. POSIX tương đối đơn giản để sử dụng và cung cấp sự linh hoạt phong phú cho để cấu hình thread Các dịch vụ đa xử lý là một giao diện dựa trên C được sử dụng bởi ứng dụng chuyển từ phiên bản cũ của Mac OS.

Khi các sự kiện xảy ra. Một cách để giảm nhẹ lỗi này là loại bỏ các tài nguyên được chia sẻ và chắc chắn rằng mỗi thread được tạo một nguồn tài nguyên riêng để hoạt động. mà sau đó gửi cho các bộ quản lý đã được chỉ định. cài đặt bộ xử lý sự kiện. nó giúp loại bỏ sự lãng phí CPU cycles và ngăn cho bộ sử lý tự động chuyển sang trạng thái ngủ và tiết kiệm năng lượng.CNPM 58 . Nếu không có sự kiện có mặt và sẵn sàng để được xử lý. run loop đẩy thread vào trạng thái sleep. Bởi vì run loop đặt thread của nó vào trạng thái ngủ khi không có gì để làm. Nếu muốn tạo ra một thread có thời gian sống dài thứ hai cần phải tự cấu hình run loop cho thread đó. Để cấu hình một run loop. người lập trình vẫn có thể truy nhập đồng bộ vào các tài nguyên sử dụng kỹ thuật khóa. mặc dù đều dựa trên công nghệ bên dưới Sinh viên thực hiện: An Thị Hồng . Nếu nhiều thread cùng sử dụng hoặc sửa đổi cùng một tài nguyên tại cùng một thời gian. *Run Loops: Run loop là một phần của cơ sở hạ tầng được sử dụng để quản lý sự kiện không đồng bộ trên thread. Cơ sở hạ tầng cung cấp bởi cả Cocoa và Carbon xử lý cấu hình của run loop của thread chính tự động.và chờ đầu vào hay nó đã sẵn sàng để chạy nhưng chưa được lập lịch để chạy như thế nào. các lỗi có thể xảy ra. Không phải bất kỳ một thread mới nào được tạo ra cũng phải sử dụng run loop nhưng làm vậy có thể cung cấp một kinh nghiệm tốt hơn cho người sử dụng. nó sẽ bị block cho đến khi khóa được thả ra bởi thread kia. và cho run loop chạy. Khi một thread cố gắng để có được một mutex hiện tại đang được một thread khác giữ. Loại khóa phổ biến nhất là là khóa loại trừ lẫn nhau.Khóa 50 . điều kiện. còn được gọi là mutex. hệ thống đánh thức thread và gửi sự kiện tới run loop. có được một tham chiếu đến các đối tượng run loop. Khóa giúp bảo vệ cho code chỉ được thực thi bởi duy nhất một thread tại một thời điểm. Run loop có thể tạo ra thread có thời gian sống dài mà lại dùng số lượng ít nhất tài nguyên. Các thread vẫn tiếp tục thay đổi trạng thái cho đến khi nó thoát ra và chuyển sang trạng thái kết thúc. Một số các framework hệ thống cung cấp hỗ trợ cho các khóa mutex. Một run loop hoạt động bằng cách theo dõi một hoặc nhiều nguồn sự kiện cho thread. atomic operation và các kỹ thuật khác. Tuy nhiên việc tạo ra các nguồn tài nguyên riêng cho mỗi thread là không bắt buộc. tất cả những gì phải làm là khởi động thread. * Các công cụ đồng bộ hóa: Một trong những nguy cơ của lập trình thread là sự tranh chấp tài nguyện giữa các thread.

Cocoa cung cấp một vài biến thể của khóa mutex để hỗ trợ các dạng khác nhau của hành vi. các thông điệp được gửi theo cách này sẽ tự động được serialize trên thread đó. Bảng cơ chế giao tiếp sau chỉ ra những cơ chế giao tiếp giữa các thread thông dụng nhất được sử dụng trong Mac OS X Cơ chế Gửi thông điệp trực tiếp Mô tả Các ứng dụng Cocoa hỗ trợ khả năng thực hiện selectors trực tiếp từ thread khác. đối tượng Cách đơn giản khác để truyền thông tin giữa hai thread là và bộ nhớ chia sẻ sử dụng một biến toàn cục. Một điều kiện hoạt động như một “người gác cổng”. Các hoạt động nguyên tử sử dụng các hướng dẫn phần cứng đặc biệt để đảm bảo rằng sửa đổi cho một biến được hoàn thành trước khi thread khác có cơ hội truy cập nó.như nhau. điều kiện “thả” thread ra và cho phép nó tiếp tục. May mắn thay. mỗi cách có ưu điểm và khuyết điểm riêng của nó. Ngoài ra. việc giao tiếp giữa các thread trở nên cần thiết. Thread có thể cần phải xử lý yêu cầu công việc mới hoặc báo cáo tiến bộ của mình cho thread của ứng dụng. Khả năng này có nghĩa là một thread về cơ bản có thể thực thi một phương thức trên bất kỳ thread khác.Khóa 50 . Điều kiện bảo đảm đúng trình tự các tác vụ trong ứng dụng. cần phải có cachs để có được thông tin từ một thread khác. Các hoạt động nguyên tử cung cấp cách thức thay thế cần ít tài nguyên hơn khóa trong các tình huống tính toán toán học hoặc logic trên dữ liệu vô hướng.CNPM 59 . Biến chia sẻ phải được bảo vệ cẩn thận với khóa Sinh viên thực hiện: An Thị Hồng . Trong những tình huống này. *Interthread communication Mặc dù một thiết kế tốt giúp giảm thiểu số lượng giao tiếp cần thiết. Có nhiều cách để giao tiếp giữa các thread. như đệ quy. hoạt động nguyên tử là một cách khác để bảo vệ và đồng bộ hóa truy cập dữ liệu. trong một số trường hợp. đối tượng chia sẻ hoặc bộ nhớ chia sẻ. thực tế là các thread chia sẻ cùng một không gian xử lý có nghĩa là có nhiều lựa chọn cho giao tiếp giữa các thread. Khi điều đó xảy ra. Biến toàn cục. Bởi vì chúng đều được thực hiện trong bối cảnh của thread chính. ngăn chặn một thread nhất định cho đến khi điều kiện của nó trở thành true. Lớp POSIX và framework Foundation đều trực tiếp hỗ trợ điều kiện Mặc dù khóa và điều kiện rất phổ biến trong thiết kế đồng thời.

Các đối tượng phân tán phù hợp cho giao tiếp với các tiến trình khác. Quan trọng hơn.Khóa 50 . Mặc dù hàng đợi thông điệp rất đơn giản và thuận tiện. Quản lý thread Mỗi tiến trình (ứng dụng) trong Mac OS X hay hệ điều hành iPhone được tạo thành từ một hoặc nhiều thread. Điều kiện giống như người giữ cửa. Điều kiện Điều kiện là một công cụ đồng bộ hóa mà bạn có thể sử dụng để kiểm soát khi một thread thực thi một phần code cụ thể. các cổng và socket có thể được sử dụng để giao tiếp với các thực thể bên ngoài.7 Giao tiếp giữa các thread 2. khi mà bản thân chi phí giao tiếp giữa các tiến trình đã cao rồi. nhưng nó cũng là một kỹ thuật rất đáng tin cậy. chỉ cho phép một thread chạy khi các điều kiện được đáp ứng. Bảng 1. Các đối tượng phân tán Các đối tượng phân tán là một công nghệ Cocoa cung cấp Cocoa một thực hiện cấp cao dựa trên giao tiếp dựa cổng.CNPM 60 . Hàng đợi thông điệp Dịch vụ đa tiến trình định nghĩa một hàng đợi trừu tượng vào trước ra trước (FIFO) để quản lý dữ liệu vào và ra. làm như vậy là rất không chi phí lớn. Sinh viên thực hiện: An Thị Hồng . treo dữ liệu.hoặc cơ chế đồng bộ hóa khác để đảm bảo tính đúng đắn trong code. Cổng được thực hiện bằng cách sử dụng các nguồn run loop. Nguồn run loop Nguồn run loop là một trong những tùy chỉnh mà bạn thiết lập để nhận các thông điệp từ một thread. Nếu không làm như vậy có thể dẫn đến lỗi xảy ra. do đó. chẳng hạn như các tiến trình và dịch vụ khác. Cổng và socket Giao tiếp dựa trên cổng là một cách phức tạp hơn để truyền thông giữa hai thread. Ứng dụng có thể tạo thêm các thread thực thi code của một chức năng cụ thể. Mỗi ứng dụng bắt đầu với một thread chạy hàm main của ứng dụng. Nguồn run loop đưa thread vào trạng thái sleep tự động khi không có gì để làm nên giúp cải thiện hiệu quả hoạt động của thread. chúng không hiệu quả như một số kỹ thuật giao tiếp khác. Mặc dù nó có thể sử dụng công nghệ này để giao tiếp interthread. làm hỏng dữ liệu. thread sleep khi không có dữ liệu đợi trên cổng.

thread thứ Kích thước stack tối thiểu được phép của thread cấp thứ cấp là 16 KB và kích thước stack phải là một 8MB . nhưng các trang thực tế kết hợp với bộ của iPhone nhớ đó không được tạo ra cho đến khi chúng được cần đến Thời gian tạo ~ 90 micro giây Giá trị này phản ánh thời gian giữa lời gọi khởi thread tạo để tạo ra các thread và thời gian mà tại đó thread bắt đầu thi hành. thực hiện hoạt động vào ra. Các cấu trúc cốt lõi cần thiết để quản lý thread và phối hợp lập lịch của nó được lưu trữ trong hạt nhân bằng cách sử dụng bộ nhớ có dây. thread đó trở thành một thực thể độc lập bên trong không gian tiến trình của ứng dụng.main thread bội số của 4 KB. a. Con số minh họa này được xác định bằng cách phân tích các giá trị trung bình và trung bình được tạo ra trong quá trình tạo ra thread trên một iMac Intel-based với bộ xử lý Core Duo 2 GHz và RAM 1 GB chạy Sinh viên thực hiện: An Thị Hồng .Khóa 50 . Stack và dữ liệu của thread được lưu trữ trong bọ nhớ của chương trình. Mỗi thread có một ngăn xếp thực thi của riêng mình và được hạt nhân lập lịch cho runtime một cách riêng biệt.main thread thread. và làm bất cứ điều gì khác người lập trình cần nó làm. Bản sau chỉ ra chi phí xấp xỉ khi tạo một thread trong ứng dụng Phần tử Chi phí xấp xỉ Cấu trúc dữ ~ 1KB liệu hạt nhân Ghi chú bộ nhớ này được sử dụng để lưu trữ các thuộc tính và cấu trúc dữ liệu của thread. phần lớn được định địa chỉ như là bộ nhớ có dây và do đó không thể được đưa vào đĩa Stack 512KB . Mỗi thread đòi hỏi phải được phân bổ bộ nhớ trong cả không gian bộ nhớ hạt nhân và không gian bộ nhớ chương trình.CNPM 61 .Bộ nhớ này được đặt sang một của Mac OS X bên trong không gian tiến trình tại thời điểm tạo 1 MB . Chi phí sử dụng thread Chi phí sử dụng thread mang ý nghĩa là hiệu suất và lượng bộ nhớ sử dụng. Một thread có thể giao tiếp với các thread khác và các quá trình khác. tất cả các thread trong một ứng dụng chia sẻ cùng bộ nhớ ảo và có quyền truy cập tương tự như chính tiến trình.Khi ứng dụng tạo ra một thread mới. Bởi vì các thread ở trong cùng một không gian tiến trình. Hầu hết các cấu trúc này được tạo ra và khởi tạo khi lần đầu tạo các thread-một quá trình tốn khá nhiều chi phí vì những yêu cầu tương tác với hạt nhân.

Khóa 50 .Tạo một đối tượng NSThread và gọi hàm start Cả hai kỹ thuật đều tạo ra một thread tách biệt trong ứng dụng. chỉ cần cung cấp tên của phương thức (xác định bởi selector) muốn sử dụng như là điểm vào của thread. Một thread tách biệt nghĩa là tài nguyên của thread sẽ được tự động phát hiện và sử dụng bởi hệ thống khi thread đó còn tồn tại. đối tượng định nghĩa phương thức đó. lớp NSThread được sử dụng để tạo ra thread. Mặc dù có thể nhận được một đối tượng NSThread và truy cập một số thuộc tính của thread. Tạo một thread * Sử dụng NSThread: Có 2 cách để tạo ra thread sử dụng lớp NSThread: . Thực hiện những thay đổi này có thể là cần thiết để tránh việc sử dụng đồng bộ hóa. Thiết kế các cấu trúc dữ liệu.5. Ví dụ như tạo một thread chạy hàm myThreadMainMethod của chính đối tượng hiện tại. Nó cũng có nghĩa là code của lập trình viên sẽ không tác động vào thread đó được nữa. có thể tăng thời gian cần để phát triển một ứng dụng. Trước Mac OS X v10. Để detach một thread mới. và các vấn đề gỡ lỗi trong mã thread.8 Chi phí sử dụng thread Chi phí khác cần xem xét khi lập trình thread là chi phí sản xuất.Mac OS X v10. nó được sử dụng rất phổ biến trong các ứng dụng Cocoa có sử dụng thread.Sử dụng hàm detachNewThreadSelector: toTarget: withObject . Tránh những chi phí này có thể tạo ra vấn đề lớn hơn ở thời gian chạy nếu phần lớn thời gian của thread là chờ đợi trong trạng thái khóa và không làm gì cả. không truyền dữ liệu cho thread hết [NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil]. b. Thiết kế một ứng dụng thread đôi khi có thể yêu cầu thay đổi cơ bản đến cách tổ chức cấu trúc dữ.5. và các dữ liệu muốn truyền vào thread lúc khởi động. Bảng 1. Vì phương thức detachNewThreadSelector: toTarget: withObject: được hỗ trợ trong tất cả các phiên bản của Mac OS X.CNPM 62 . Sinh viên thực hiện: An Thị Hồng .

Trong OS X v10. // Actually create the thread Để gửi thông điệp tới một thread đang chạy có thể sử dụng phương thức performSelector: onThread: withObject: waitUntilDone. Phương thức này có những thông tin chính xác giống như phương thức detachNewThreadSelector: toTarget: withObject và sử dụng nó để khởi tạo một thể hiện NSThread mới. đối tượng myObj có phương thức doSomething mà muốn chạy ở thread ngầm. có thể sử dụng đoạn code sau: Sinh viên thực hiện: An Thị Hồng .Khóa 50 . Công nghệ này thực sự có thể được sử dụng trong bất kỳ loại ứng dụng nào (bao gồm cả Cocoa và các ứng dụng Cocoa Touch) và sẽ thuận tiện hơn nếu dự định viết phần mềm cho nhiều nền tảng khác nhau.5 và là cách thuận tiện để liên lạc giữa các thread. Phương thức performSelectorInBackground: withObject tạo ra một thread tách biệt mới. *Sử dụng POSIX Thread: Trong Mac OS X và iPhone OS có thể tạo thread dựa trên ngôn ngữ C bằng cách sử dụng API thread POSIX. Nó cũng làm cho nó có thể sử dụng đối tượng thread để tham chiếu tới thread sau đó.CNPM 63 .5. Phương thức này mới được giới thiệu từ Mac OS X v10. phải gọi hàm start của đối tượng thread như trong ví dụ sau: NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMetho d:) object:nil]. Phương thức này là phương thức trong hầu hết đối tượng của Cocoa. tất cả các đối tượng có khả năng tạo một thread mới và sử dụng nó để thực hiện một phương thức của mình. Cách đơn giản để khởi tạo một đối tượng NSThread trong Mac OS X v10. * Sử dụng NSObject: Trong hệ điều hành iPhone và kể từ Mac OS X v10.5 Mac bổ sung hỗ trợ đã làm cho nó có thể làm và thiết lập các thuộc tính khác nhau thread trước khi bắt đầu thread này.nhưng điều đó chỉ có thể làm được trong bản thân thread khi nó đã chạy.5 và sau đó là sử dụng phương thức initWithTarget: selector: object. Để start thread. [myThread start]. Ví dụ. Khi POSIX rountine sử đụng để tạo thread: pthread_create. Nhưng hàm này không start một thread.

Bảng sau liệt kê các tùy chọn khác nhau cho mỗi công nghệ. người lập trình có thể cấu hình lại môi trường thread. tham số hiện tại. Cấu hình các thuộc tính của thread Sau khi tạo ra một thread.giá trị có thể được truy cập từ bất cứ nơi nào trong thread này. hệ thống cấp phát một lượng bộ nhớ trong không gian tiến trình để hoạt động như là ngăn xếp của thread đó.9 Cấu hình thread * Bộ lưu trữ địa phương của thread Mỗi thread duy trì một từ điển cặp khóa .5 trở về sau.[myObj performSelectorInBackground:@selector(doSomething) withObject:nil]. Ngăn xếp quản lý stack frame và các biến địa phương của thread đã được khai báo.CNPM 64 POSIX Dịch vụ đa tiến trình . Sinh viên thực hiện: An Thị Hồng . Công nghệ Cocoa Tùy chọn Tạo một đối tượng NSThread (không sử dụng hàm detachNewThreadSelector: toTarget: withObject). Phương thức này có tác dụng giống như phương thức detachNewThreadSelector: toTarget: withObject của lớp NSThread với đối tượng. * Kích thước stack của thread: Đối với mỗi thread mới được tạo ra. Nếu muốn thay đổi kích thước ngăn xếp của một thread nhất định. d. Truyền tham số vào hàm pthread_create khi tạo thread Truyền kích thước stack vào hàm MPCreateTask khi tạo thread. Bảng 1. selector. phải làm như vậy trước khi tạo các thread. Từ điển này cũng có thể được sử dụng để lưu trữ các thông tin tùy biến tồn tại suốt quá trình thực hiện thread. Tất cả các công nghệ lập trình thread đều cung cấp một số cách thiết lập kích thước stack mặc dù thiết lập kích thước stack sử dụng NSThread chỉ có sẵn trong hệ điều hành iPhone và Mac OS X kể từ vesion v10. Trước khi gọi hàm start. Thread ngay lập tức được cấu hình mặc định và bắt đầu chạy.Khóa 50 . sử dụng hàm setStackSize để thiết lập kích thước stack mới Tạo một cấu trúc pthread_attr_t và sử dụng hàm pthread_attr_setstacksize để đổi kích thước mặc định của stack.

Cài đặt một final try/catch trong thread entry routine cho phép nắm bắt bất kỳ trường hợp ngoại lệ nào và đưa ra một phản ứng thích hợp. Giải phóng các đối tượng thường giúp cho bộ nhớ của ứng dụng không bị phình ra quá lớn. nên không thể trộn và kết hợp các lời gọi đến hai công nghệ.Khóa 50 .Cocoa và POSIX lưu trữ từ điển của thread theo những cách khác nhau. Mặc dù tốt nhất để xử lý các trường hợp ngoại lệ là ngay ở điểm nó có thể xảy ra. e. Autorelease pool đảm bảo rằng các đối tượng đã tự giải phóng được bắt lại. Bởi vì các autorelease ở cấp cao nhất không được giải phóng các đối tượng của nó cho đến khi thread thoát ra. *Thiết lập một run loop Sinh viên thực hiện: An Thị Hồng . sử dụng hàm pthread_setschedparam. mã thread cần được chuẩn bị để đón bất kỳ trường hợp ngoại lệ có thể xảy ra. Không bắt được ngoại lệ trong thread có thể khiến ứng dụng bị thoát ra. Trong POSIX. hủy autorelease pool này là điều cuối cùng làm trong thread. Từ đó có thể thêm bất kỳ khóa nào vào trong thread của mình. sử dụng chức năng pthread_setspecific và pthread_getspecific để thiết lập và nhận được chìa khóa và giá trị của thread. Trong Cocoa. *Thiết lập bộ quản lý ngoại lệ: Nếu ứng dụng bắt và xử lý các trường hợp ngoại lệ. Nếu viết ứng dụng sử dụng mô hình quản lý bộ nhớ. nơi mà ứng dụng xử lý sự giữ lại và giải phóng các đối tượng autorelease pool giữ tất cả các đối tượng được tự động giải phóng từ thread đó. Viết thread entry rountine * Tạo Autorelease Pool: Các ứng dụng xây dựng trên các framework của Objective-C thường phải tạo ít nhất một autorelease pool cho mỗi thread của mình. Tương tự như vậy. sử dụng phương thức threadDictionary của đối tượng NSThread để lấy nhận được đối tượng NSMutableDictionary.CNPM 65 . các thread có thời gian tồn tại dài nên tạo thêm autorelease pool để giải phóng các đối tượng thường xuyên hơn. Với POSIX thread. * Thiết lập priority của thread: Với đối tượng NSThread của Cocoa sử dụng hàm setThreadPriority. tạo ra một autorelease pool là điều đầu tiên phải làm trong thread entry routine. mặc dù nó không giải phóng chúng cho đến khi thread tự thoát. Nếu một ứng dụng sử dụng mô hình quản lý.

Trong vòng lặp. Anatomy of a Run Loop Run loop là một vòng lặp thread đưa vào để chạy bộ xử lý sự kiện nhằm mục đích phản ứng lại các sự kiện đến. Ca cao. Mac OS X và hệ điều hành iPhone cung cấp built-in support để thực thi run loop trong mỗi thread. Run loop nhận các sự kiện từ hai loại nguồn khác nhau. f. Một ứng dụng mới không cần phải tạo ra các đối tượng này một cách rõ ràng. phần code này cung cấp vòng lặp while hay for dùng để điều khiển run loop. Lập trình viên vẫn phải thiết kế code cho thread để bắt đầu run loop vào các thời điểm thích hợp và đáp ứng với các sự kiện đến. Kết thúc một thread 3. Nguồn input cung cấp các sự Sinh viên thực hiện: An Thị Hồng . Run loop quản lý không hoàn toàn tự động. mỗi thread. đều có quan hệ với một run loop. Run loop Run loop là một phần của cơ sở hạ tầng cơ bản liên quan đến thread. và UIKit bắt đầu run loop của main thread một cách tự động. cần phải thiết lập một run loop cho thread. Với lựa chọn thứ hai. bao gồm thread chính của ứng dụng. a. Một run loop là một vòng lặp xử lý sự kiện được sử dụng để lên lịch làm việc và phối hợp các sự kiện vào. người lập trình phải tự thiết lập run loop và tự mở nó. Cả hai Cocoa và Core Foundation đều cung cấp đố các đối tượng run giúp cấu hình và quản lý các run loop. nhưng nếu tạo ra bất kỳ một thread thứ cấp nào. và thread thoát ra khi tác vụ này hoàn thành. Carbon. Lựa chọn đầu tiên không yêu cầu cài đặt đặc biệt gì trong code.Khóa 50 .CNPM 66 . Lựa chọn đầu tiên là viết mã cho một thread như là một tách vụ lâu dài sẽ được thực hiện với sự gián đoạn ít hoặc không có. sử dụng một đối tượng run loop để "chạy" phần code xử lý sự kiện và gọi bộ xử lí đã được cài đặt.Có 2 lựa chọn để chạy các thread riêng biệt. Chỉ những thread thứ cấp mới cần chạy run loop một cách rõ ràng.nói cách khác. các thread chính sẽ tự động thiết lập và chạy run loop của nó như là một phần của quá trình khởi động ứng dụng nói chung. Lựa chọn thứ hai là đưa thread của bạn vào một vòng lặp và có yêu cầu quá trình tự động khi nhận được. Mục đích của run loop là giữ thread bận rộn khi có những việc cần làm và đưa thread vào trạng thái sleep khi không có gì để làm. Trong cả hai ứng dụng Carbon và Cocoa. Phần code của lập trình viên chứa các câu lệnh điều khiển để thực thi phần vòng lặp thực sự của run loop .

Nguồn timer cung cấp các sự kiện để thói quen xử lý ọ. thông thường là các thông điệp từ thread hoặc ứng dụng khác. b. Hình 1. run loop cũng tạo ra các thông báo về hành vi của mình.kiện không đồng bộ. Sử dụng Core Foundation để cài đặt bộ quan sát các run loop đã đăng ký cho thread. Nguồn timer cung cấp các sự kiện đồng bộ. chỉ các nguồn liên quan tới kiểu đó mới được theo dõi và cho phép nhận sự kiện. Sinh viên thực hiện: An Thị Hồng . Hình sau cho thấy cấu trúc lý thuyết của một run loop và các nguồn của nó.CNPM 67 . Cả hai loại nguồn sử dụng một application specific handler routine để xử lý sự kiện khi nó đến. Bộ quan sát các run loop đã đăng ký có thể nhận được những thông báo này và dùng chúng để bổ sung các xử lý cho thread. phải chỉ rõ kiểu run loop. Mỗi lần chạy run loop.Khóa 50 . bộ quan sát chỉ có liên quan tới kiểu được thông báo về tiến trình của run loop) Nguồn thuộc các kiểu khác giữ các sự kiện mới cho đến khi được truyền cho một vòng lạp ở kiểu tương ứng. nhưng không làm run loop thoát ra. Trong suốt quá trình chạy. xảy ra tại một thời điểm theo lịch trình hoặc một khoảng thời gian lặp đi lặp lại. (Tương tự như vậy.14 Cấu trúc và nguồn của runloop Ngoài việc xử lý nguồn đầu vào. Các nguồn input cung cấp các sự kiện không đồng bộ cho các bộ xử lý tương ứng và vọi phương thức runUntilDate: để thoát ra. Các kiểu run loop: Kiểu run loop là tập hợp các nguồn input và timer được theo dõi và thu thập bởi bộ quan sát run loop.

Đối với thread thứ cấp. lập trình viên cần phải quyết định khi nào run loop cần thiết và nếu cần thì phải tự cấu hình và start nó. Khi nào thì sử dụng run loop Chỉ khi tạo ra các thread thứ cấp trong ứng dụng thì mới cần chạy run loop một cách rõ ràng.Khóa 50 . Các kiểu run loop Kiểu Mặc định Tên NSDefaultRunLoopMode (Cocoa) kCFRunLoopDefaultMode Foundation) NSConectionReplyMode (Cocoa) Mô tả Kiểu mặc định là kiểu (Core được sử dụng nhiều nhất.10 Các chế độ run loop c. hàm RunApplicationEventLoop bắt đầu vòng lặp chính cho các ứng dụng Carbon. Cocoa sử dụng chế độ này kết hợp với các đối tượng NSConnection để theo dõi các trả lời. bạn không bao giờ phải gọi các hàm này. Nếu bạn sử dụng các project template của Xcode để tạo ra các ứng dụng của bạn.CNPM 68 . Run loop cho thread chính của ứng dụng là một phần cơ sở hạ tầng quan trọng. Không cần phải start run loop của Sinh viên thực hiện: An Thị Hồng . Cả Cocoa và Carbon cung cấp mã chạy vòng lặp chính của ứng ụng và start vòng lặp đó tự động. Tương tự như vậy.Cocoa và Core Foundation xác định một chế độ mặc định và một số chế độ thường dùng được biểu diễn bằng một chuỗi. Chế độ thường dùng Kết nối Modal NSModalPanelRunLoopMode (Cocoa) Theo dấu sự NSEventTrackingRunLoopMode (Cocoa) kiện Chế độ NSRunLoopCommonModes (Cocoa) thông dụng kCFRunLoopCommonModes (Core Foundation) Bảng 1. Cocoa sử dụng chế độ này để giới hạn các sự kiện trong suốt quá trình kéo chuột . Hàm run của UIApplication trong hệ điều hành iPhone (hoặc NSApplication trong Mac OS X) bắt đầu vòng lặp chính của ứng dụng như một phần của trình tự khởi động bình thường. Cocoa sử dụng chế độ này để định nghĩa các sự kiện dành cho modal panel.

Sử dụng bất kì một phương thức performSelector … nào của Cocoa . Sinh viên thực hiện: An Thị Hồng . Nếu run loop không có bất cứ nguồn nào để theo dõi. bạn cần phải start một run loop định làm bất cứ điều gì sau đây: . Sử dụng đối tượng run loop Một đối tượng run loop cung cấp giao diện chính cho việc thêm các nguồn input. nó sẽ ngay lập tức thoát ra khi lập trình viên cố gắng chạy nó.Sử dụng cổng hay các nguồn đầu vào tùy biến để giao tiếp với các thread khác .Sử dụng hàm CFRunLoopGetCurrent Tuy nhiên.Giữ cho thread thực thi một tác vụ định kỳ nào đó.CNPM 69 .thread trong mọi trường hợp. *Cấu hình một run loop Trước khi chạy run loop trên thread thứ cấp. có thể nhận được đối tượng CFRunLoopRef từ đối tượng NSRunLoop khi cần thiết thông qua hàm getCFRunLoop của lớp NSRunLoop. Bởi cả 2 đối tượng đều chỉ đến 1 run loom nên có thể kết hợp cả 2 cách gọi tới đối tượng NSRunLoop và CFRunLoopRef khi cần thiết. Ví dụ. bạn có thể tránh start run loop. Mỗi thread có một đối tượng run loop duy nhất liên kết với nó. Ví dụ: nếu bạn sử dụng một thread để thực hiện một số tác vụ dài hạn và đã định trước.Khóa 50 . Trong ứng dụng Carbon hay BSD. Run loop được dành cho các tình huống khi muốn tương tác nhiều hơn với thread. đối tượng này là một thể hiện của lớp NSRunLoop.Trong ứng dụng Cocoa. có thể sử dụng một trong các cách sau: . timer và bộ quan sát run loop để chạy no. nó là một con trỏ trỏ tới CFRunLoopRef.Sử dụng timer trên thread . d. việc đầu tiên cần làm là phải thêm vào ít nhất một nguồn input hoặc timer cho nó. * Lấy ra đối tượng run loop Để nhận được đối tượng run loop từ thread hiện tại. Trong Cocoa. sử dụng hàm currentRunLoop của lớp NSRunLoop để nhận về đối tượng NSRunLoop .

Ngoài việc cài đặt nguồn cho run loop.Truy cập tự động vào thiết bị vào / ra âm thanh . cũng như là: . Core Audio Core Audio cung cấp giao diện phần mềm để thực hiện các tính năng âm thanh trong các ứng dụng của hệ điều hành iPhone và Mac OS X.CNPM 70 .Để cài đặt một bộ giám sát run loop. bạn sử dụng Core Audio trong ứng dụng Cocoa Touch. và phân tích file stream. 1. hiệu ứng âm thanh. lập trình viên cần phải cài đặt bộ giám sát run loop và dùng nó để phát hiện ra các trạng thái hoạt động khác nhau của run loop. Nó bao gồm một tập các framework được thiết kế để xử lý các nhu cầu âm thanh trong ứng dụng của bạn.6. phát lại.Là một API quản lý các khía cạnh âm thanh của các ứng dụng trên thiết bị có thể nhận các cuộc gọi .Khóa 50 . Core Audio được tích hợp chặt chẽ vào hệ điều hành iPhone và Mac OS X nhằm đạt hiệu năng cao và độ trễ thấp. chuyển đổi định dạng. tạo một đối tượng CFRunLoopObserverRef và sử dụng hàm CFRunLoopAddObserver để add nó vào run loop của mình. Trong Mac OS X.Một equalizer và mixer tích hợp sẵn mà người dùng có thể sử dụng trong các ứng dụng của mình . bạn có thể sử dụng Core Audio trong ứng dụng C. kết quả trong một môi trường lập trình linh hoạt có thể duy trì độ trễ thấp thông qua các chuỗi tín hiệu. Tín hiệu âm thanh vượt qua đến và đi từ phần cứng thông qua HAL. Trong hệ điều hành iPhone.3.HAL) như trong hình dưới. hoặc C + +. Trong Mac OS X. khả năng của Core Audio bao gồm ghi âm. định vị. Core Audio xử lý tất cả các khía cạnh liên quan tới âm thanh trên mỗi nền tảng này.Tối ưu hóa để kéo dài tuổi thọ pin mà không ảnh hưởng tới chất lượng âm thanh Core Audio kết hợp giao diện lập trình C và Objective-C với tích hợp hệ thống. Core Audio là gì? Core Audio là cơ sở hạ tầng âm thanh kỹ thuật số của iPhone OS và Mac OS X. Có thể truy Sinh viên thực hiện: An Thị Hồng . phần lớn các dịch vụ Core Audio được xếp là tầng trên của layer trừu tượng của phần cứng (Hardware Abstraction Layer . Objective-C. 1. Trong hệ điều hành iPhone.

Converter.15 Kiến trúc Core Audio của Mac OS X 2 framework Audio Toolbox và Audio Unit chứa các dịch vụ ở mức ứng dụng của Core Audio: . . và đồng bộ hóa âm thanh. Trong Mac OS X.Sử dụng Audio File.. . Trong Mac OS X lập trình viên cũng có thể tự tạo ra các codec của riêng mình. Codec Services để đọc và ghi lên đĩa và để thực hiện biến đổi định dạng dữ liệu âm thanh. Framework Core MIDI (Musical Instrument Digital Interface) cung cấp giao diện tương tự để làm việc với dữ liệu và thiết bị MIDI. tạm dừng. cũng có thể tạo ra các đơn vị âm thanh tùy chỉnh để sử dụng trong các ứng dụng hoặc cung cấp để sử dụng trong các ứng dụng khác.Sử dụng Audio Unit Services và Audio Processing Graph Services (đại diện trong hình là "Audio Unit") để lưu trữ các đơn vị âm thanh (audio plug-in) trong ứng dụng. phát lại.cập HAL sử dụng Các dịch vụ phần cứng âm thanh (Audio Hardware Services) của Core Audio framework khi yêu cầu âm thanh thời gian thực.Khóa 50 .CNPM 71 .Sử dụng Music Sequencing Services để chơi dữ liệu âm nhạc dựa trên MIDI.Audio Queue Service: để ghi âm. . Sinh viên thực hiện: An Thị Hồng . lặp. Hình 1.

Sử dụng System Sound Services (đại diện trong hình là "System sounds") để phát âm thanh hệ thống và hiệu ứng âm thanh.CNPM 72 . Các tầng kiến trúc giao diện lập trình API Giao diên lập trình cho Core Audio được chia thành 3 lớp : các dịch vụ ở lớp cao. có các dịch vụ bổ sung trong hệ điều hành iPhone không có trong Mac OS X. cụ thể là HAL và các I / O Kit. Ví dụ.Sử dụng Core Audio Clock Services cho sự động bộ hóa âm thanh và MIDI và quản lý định dạng thời gian.Khóa 50 . Không có API cho các dịch vụ đó phải được quản lý rất chặt chẽ bởi hệ điều hành. Kiến trúc Core Audio của hệ điều hành iPhone 2.16. Core Audio trong hệ điều hành iPhone được tối ưu hóa cho các tài nguyên máy tính có sẵn trong một nền tảng di động chạy bằng pin. các dịch vụ ở lớp trung và các dịch vụ ở lớp thấp. cooperative và hướng tác vụ. a. Sinh viên thực hiện: An Thị Hồng . Cơ bản về Core Audio Apple đã thiết kế các giao diện phần mềm cho Core Audio sử dụng phương pháp phân lớp. Hình 1. . Hình sau cung cấp một cái nhìn cấp cao của kiến trúc âm thanh trong hệ điều hành iPhone. Tuy nhiên. Audio Session Service cho phép quản lý các hành vi âm thanh của các ứng dụng của bạn trong bối cảnh của một thiết bị có chức năng như một điện thoại di động và iPod..

OpenAL.Khóa 50 . sử dụng trực tiếp I / O cho âm thanh thời gian thực trong game.Core MIDI cung cấp sự trừu tượng của phần mềm để làm việc với luồng và các thiết bị MIDI. Sinh viên thực hiện: An Thị Hồng .CNPM 73 . . Tuy nhiên.Các bộ vào ra I/O tương tác với các driver . nhiều ứng dụng audio không truy cập lớp này.17 Ba lớp API của Core Audio Lớp thấp nhất bao gồm: .Hình 1.Host Time Services cung cấp khả năng truy cập vào đồng hồ của máy tính Các ứng dụng trong Mac OS X có thể sử dụng trực tiếp các công nghệ này khi cần thực thi trong thời gian thực đạt hiệu quả cao. Kết quả nhỏ ơn đáng kể. Core Audio trong hệ điều hành iPhone cung cấp nhiều cách để đạt được âm thanh thời gian thực bằng cách sử dụng giao diện cấp cao hơn. Thật vậy. điều chỉnh API thích hợp cho một nền tảng di động.Tầng trừu tượng hóa phần cứng âm thanh (audio HAL) cung cấp một giao diện độc lập về phần cứng và driver cho phần cứng .

Các lớp trung trong Core Audio bao gồm các dịch vụ cho chuyển đổi định dạng dữ liệu.Core Audio Clock Services hỗ trợ đồng bộ hóa âm thanh và MIDI cũng như là chuyển đổi thời gian. .Audio Converter Services giúp ứng dụng làm việc với bộ chuyển đổi định dạng dữ liệu . phân tích luồng. . và làm việc với các plug-ins. . đọc và ghi vào đĩa. Sinh viên thực hiện: An Thị Hồng .18 Cấu trúc Core Audio của hệ điều hành iPhone Lớp cao nhất trong Core Audio bao gồm các giao diện kết hợp các tính năng từ các lớp thấp hơn. .Audio Format Services quản lý định dạng dữ liệu âm thanh Core Audio trong hệ điều hành iPhone hỗ trợ hầu hết các dịch vụ này như trong hình: Hình 1.Audio Unit Services và Audio Processing Graph Services giúp ứng dụng làm việc với digital signal processing (DSP) plug-ín như là equalizer hay mixer.Khóa 50 . như là play file được stream qua kết nối mạng.CNPM 74 .Audio File Services hỗ trợ việc đọc và ghi dữ liệu âm thanh từ file .Audio File Stream giúp phân tích luồng.

Audio Queue Services cho phép ghi. và đồng bộ hóa âm thanh.CNPM 75 .AV Foundation framework: chứa lớp AVAudioPlayer. . Framework . và giúp thực hiện các tính năng như tua lại và chuyển bài kế tiếp. luồng.OpenAL framework: làm việc với OpenAL. c.Lớp AVAudioPlayer cung cấp một giao diện Objective-C đơn giản để chơi và lặp âm thanh trong các ứng dụng iPhone OS. khi muốn làm việc với một file âm thanh có sẵn trong máy. Trong hệ điều hành iPhone. tạm dừng.. Proxy Object Core Audio sử dụng khái niệm proxy object để đại diện cho các tập tin. audio player. Lớp AVAudioPlayer xử lý tất cả các định dạng âm thanh hỗ trợ trong hệ điều hành iPhone. .OpenAL trong Core Audio thực hiện các chuẩn OpenAL mã nguồn mở cho việc định vị âm thanh.Core Audio framework cung cấp các kiểu dữ liệu của Core Audio cũng như là giao diện cho các dịch vụ thuộc tầng thấp. . . các giao diện stream cho audio playback. .Audio Unit framework: làm việc với audio plug-in .Audio Toolbox framework cung cấp giao diện giữa các dịch vụ thuộc tầng cao và tầng trung trong Core Audio. b. framework này còn bao gồm cả Audio Session Services để quản lý hành vi của âm thanh trong ứng dụng chạy trên iPhone và iPod. bước đầu tiên là phải tạo thể hiện của đối tượng AudioFileID. .Extended Audio File Services kết hợp các tính năng của Audio File Services và Audio Converter Services. Nó cung cấp cho bạn một giao diện thống nhất cho việc đọc và ghi các dữ liệu âm thanh không nén và có nén.h. Đối tượng này được khai báo trong AudioFile. Sinh viên thực hiện: An Thị Hồng . Hàm này sẽ trả về một ánh xạ tới đối tượng file âm thanh và người dùng có thể làm việc với file âm thanh thực thông qua việc giao tiếp với đối tượng proxy.. lặp.. Sau đó. chơi. tạo file âm thanh thực liên kết với đối tượng đó thông qua hàm AudioFileCreateWithURL.Khóa 50 . Ví dụ.

Core Audio sử dụng hàm gọi lại cho những việc như: .CNPM 76 . hàm gọi lại của bạn đọc từ đĩa và cung cấp các dữ liệu).Cung cấp một tập dữ liệu âm thanh mới cho ứng dụng (chẳng hạn như để ghi âm. .d. khi một đối tượng hàng đợi thay đổi thuộc tính. chẳng hạn như AudioQueueNewOutput.h: typedef void (*AudioQueuePropertyListenerProc) ( void * AudioQueueRef inUserData. Trong một lời gọi hàm bình thường. hệ điều hành sẽ gọi hành vi mà lập trình viên thực thi trong ứng dụng của mình. ứng dụng sẽ gọi hành vi được định nghĩa bởi Apple trong việc thực hiện của hệ điều hành. những gì diễn ra bên dưới. phản ứng với các tin nhắn âm thanh.Yêu cầu một tập dữ liệu âm thanh mới từ ứng dụng (chẳng hạn như để phát lại. lập trình viên đã tuân theo các giao diện hàm quy định trong file header của hàm đó. inAQ. inID AudioQueuePropertyID ). Để thực thi và sử dụng một hàm gọi lại trong ứng dụng cần phải làm hai việc: Sinh viên thực hiện: An Thị Hồng .Khóa 50 . Nó hoạt động bởi vì. Ứng dụng yêu cầu một đối tượng hàng đợi âm thanh chơi lại (playback audio queue) và nhận được một đối tượng trả về. và không cần biết. Bằng việc định nghĩa một hàm gọi lại trong ứng dụng theo một mẫu. hệ điều hành có thể gọi nó thành công. Trong trường hợp hàm gọi lại. Ví dụ. Lập trình viên không biết. Hàm gọi lại Nhiều giao diện Core Audio có thể giao tiếp với ứng dụng bằng cách sử dụng hàm gọi lại (callback). trong khi thực hiện lời gọi. mà lập trình viên có thể thực hiện.Thông báo với ứng dụng một đối tượng phần mềm đã thay đổi trạng thái Một cách để hiểu là để hàm gọi lại là đảo ngược quan điểm vvề việc ai gọi ai. hàm gọi lại sẽ ghi dữ liệu mới vào đĩa). Audio Queue Service quy định cụ thể một mẫu cho một hàm gọi lại. Template của hàm gọi lại này được định nghĩa trong AudioQueue. .

Đăng ký hàm gọi lại với đối tượng muốn tương tác với.. Sinh viên thực hiện: An Thị Hồng . .CNPM 77 .Thực thi hàm gọi lại.Khóa 50 .

Mô hình tổng quan hệ thống được biểu diễn như hình dưới: Hình 2.Khóa 50 .1 Hệ thống Mobile Portal Hệ thống Mobile Portal là hệ thông cổng tìm kiếm thông tin trực tuyến được phát triển trên phục vụ cho nhu cầu tìm kiếm thông tin trên các thiết bị di động.1 Mô hình hệ thống Mobile Portal Trong đó: Sinh viên thực hiện: An Thị Hồng .CHƯƠNG 2: TỔNG QUAN VỀ HỆ THỐNG TÌM KIẾM MOBILE PORTAL 2. Hệ thống được chia ra làm 3 tầng với những chức năng và nhiệm vụ cụ thể: • • • Tầng ứng dụng (Cocoa Touch Application): đây cũng chính là thành phần chính được tập trung trình bày trong đồ án này. Tầng giao diện di động (Mobile Interface) Tầng dưới cùng là tầng máy tìm kiếm socbay (Socbay Search Engine): được nghiên cứu và phát triển bởi công ty Naiscorp và đã đi vào hoạt động được hơn 3 năm.CNPM 78 .

Khóa 50 . Cocoa Touch Application: Tầng Cocoa Touch Application được phát triển thành một ứng dụng chạy trên điện thoại di động cho phép giao tiếp với người dùng thông qua giao diện đồ họa ứng dụng 2. Sinh viên thực hiện: An Thị Hồng .Socbay Search Engine: máy tìm kiếm của socbay chịu trách nhiệm thu thập dữ liệu từ các nguồn khác nhau trên internet. Ngoài ra Mobile Interface còn quản lý module giao tiếp cho phép lấy và trả dữ liệu từ máy chủ lưu trữ về cho ứng dụng Java khi nhận được yêu cầu từ ứng dụng. Dữ liệu được đánh chỉ mục và lưu trữ trong cơ sở dữ liệu của socbay. indexer. Tầng này được nghiên cứu và phát triển tương đối hoàn thiện bởi công ty Naiscorp Mobile Interface: tầng Mobile Interface hỗ trợ cho việc chuẩn hóa dữ liệu phục vụ cho điện thoại di đông.2 Máy tìm kiếm Socbay (Socbay Search Engine) Socbay là một máy tìm kiếm với đầy đủ quy mô và thuần Việt được phát triển hoàn thiện bởi công ty Naiscorp. Mô hình máy tìm kiếm của socbay hiện nay đã có nhiều thay đổi và cải tiến tuy nhiên các thành phần chính của mô hình máy tìm kiếm vấn là: crawler.CNPM 79 .

BMP. xử lí dữ liệu phục vụ cho thành phần searcher.Hình 2. và trong đó Ranking là vấn đề rất quan trọng phải được giải quyết. thông tin rao vặt. xử lí và lưu trữ vào Store server. và từ điển. tin tức.Khóa 50 . Dữ liệu có thể được lấy từ nhiều nguồn khác nhau. Dịch vụ MP3 Mô tả Nguồn dữ liệu là từ các trang nghe nhạc. Các dữ liệu này được lấy từ nhiều nguồn khác nhau trên internet. Trong tương lai gần sẽ Sinh viên thực hiện: An Thị Hồng . … và đã được resize phù hợp với kích thước màn hình điện thoại. Vai trò chính của máy tìm kiếm socbay trong hệ thống Mobile Portal: • Thu thập dữ liệu cho các dịch vụ trong hệ thống • Phân tích truy vấn ngắn dựa trên thói quen người dùng 2. Indexer: Thành phần indexer làm công việc đánh chỉ mục dữ liệu. Hỗ trợ nhiều định dạng khác nhau phổ biến hiện nay như JPEG. hình ảnh. PNG.3. hosting phổ biến hiện nay.1. thông tin địa điểm.CNPM 80 Hình ảnh . TIFF. dữ liệu cần phải được tổ chức lại cho phù hợp. Số lượng lên tới hàng triệu bài và liên tục được cập nhật. Dữ liệu được lấy từ nhiều nguồn khác nhau và được lọc kĩ. Tuy nhiên để dữ liệu có thể phục vụ cho các thiết bị di động. Thu thập dữ liệu cho các dịch vụ Các dịch vụ đang được cung cấp tới người sử dụng của Mobile Portal bao gồm: MP3.1 Mô hình đơn giản của Socbay Search Engine Crawler: Thành phần này của hệ thống làm nhiệm vụ thu thập các nguồn dữ liệu dạng thô từ trên Internet. Searcher: Tìm kiếm kết quả cho câu truy vấn của người dùng dựa trên dữ liệu đã được xử lí. Cẩm nang tư Hệ thống hiện nay mới dừng lại ở mức cung cấp vấn thông tin có sẵn cho người dùng. GIF.

Trong tương lai dịch vụ này sẽ có thêm mục chỉ đường. vietnamnet. Truyện đề. … . Nguồn dữ liệu từ các trang chứa dữ liệu địa điểm và các trang đăng thông tin địa điểm. Vai trò của Mobile Interface trong hệ thống tìm kiếm Mobile Portal là: Sinh viên thực hiện: An Thị Hồng .Khóa 50 . hỗ trợ GPS tại các thành phố lớn cho người dùng. người dùng sẽ được hỗ trợ trong việc tìm kiếm thông tin với những câu truy vấn ngắn nhất như: iphone hn. tìm đường. … . đó là cả vấn đề khác yêu cầu phải có nghiên cứu nghiêm túc. café.CNPM 81 .3.1 Các dịch vụ 2. Thông tin địa Cung cấp thông tin về các địa điểm phổ biến như điểm karaoke. shop. 2. hay atm hcm. dantri.4 Tầng giao diện di động (Mobile Interface) Mobile Interface là thành phần giao diện trung gian giữa máy tìm kiếm Socbay và ứng dụng di động. Vấn đề cập nhật thông tin liên tục và chống trùng lặp dữ liệu được xử lí rất tốt.2 Phân tích truy vấn ngắn dựa trên thói quen người dùng Search engine cho Mobile Portal là kết quả của việc nghiên cứu thói quen của người dùng trên thiết bị di động. Hệ thống đã ứng dụng thành công kết quả của việc nghiên cứu này. … . Đây không phải chỉ là việc chuyển cách sử dụng search engine từ máy tính để bàn sang thiết bị di động. Một kho các truyện đọc được phân chia theo chủ Bảng 2.được tích hợp thêm khả năng đăng thông tin cho người dùng Tin tức Được tổng hợp từ các báo điện tử phổ biến hiện nay như vnexpress. Việc bị hạn chế về số lượng phím bấm và khả năng trình diễn thông tin dẫn tới việc phải có một cơ chế cho phép hiểu thông tin người dùng nhập vào một cách tốt nhất với query có độ dài ngắn nhất.

Với mỗi hành động của người dùng: search. MP3 Kích thước của tập tin cũng được thay đổi phù hợp với nhu cầu của người dùng. và những hạn chế về mặt đường truyền kết nối (tốc độ kết nối chậm). và nhanh chóng phù vấn hợp với thói quen người dùng. Dữ liệu trên thiết bị di động phải thật sự ngắn gọn. Kích cỡ hình ảnh có nhiều dạng phù hợp với các mục đích khác nhau. download thì hệ thống sẽ đưa ra hình ảnh với kích thước tương ứng. preview.CNPM 82 . và nhóm đã thành Sinh viên thực hiện: An Thị Hồng . Truyện dẫn đến việc phải giải quyết bài toán trích chọn thông tin. Đây chính là vấn đề quan trọng nhất đối với việc chuẩn hóa dữ liệu cho thiết bị di động.1 Quá trình chuẩn hóa dữ liệu cho thiết bị di động: Với những hạn chế về mặt hiển thị (kích thước màn hình hiển thị bé).Chuẩn hóa dữ liệu cho thiết bị di động . hệ thống hỗ trợ giao thức cho nghe thử. gửi MMS. Có hai chế độ được hỗ trợ là tải nhạc chất lượng cao và tải nhạc chất lượng thấp. lượng dữ liệu truyền tải cũng giảm đáng kể. súc tích nhưng vẫn bao gồm đầy đủ các thông tin cần thiết. Phiên bản nhạc chất lượng thấp dành cho mục đích làm nhạc chuông.4.Quản lý các module kết nối 2. Địa Nhu cầu theo dõi thông tin với thiết bị di động điểm. Phiên bản nhạc chất lượng cao dành cho người muốn sở hữu một bản nhạc chân thực hơn. Ngoài ra để phục vụ nhu cầu nghe trước khi tải về.Khóa 50 . giảm thời gian tải dữ liệu. Hình ảnh Được xử lí đa luồng nên việc load kết quả search bao gồm các hình thumbnails là rất nhanh chóng. Việc chuẩn hóa dữ liệu cho mỗi dịch vụ trong hệ thống được mô tả như sau: Dịch vụ Mô tả Cẩm nang tư Thông tin hết sức ngắn gọn. Tin tức. tiết kiệm tối đa cho người dùng..

Ứng dụng được tích hợp nhiều dịch vụ như nghe nhạc. địa điểm. cẩm nang tư vấn và trong tương lai có thể mở rộng thêm nhiều dịch vụ khác. Việc phát triển ứng dụng phia client này là trọng tâm chính của đồ án và sẽ được trình bày chi tiết hơn trong phần II của đồ án. lưu log. Sinh viên thực hiện: An Thị Hồng .2 Thiết kế module kết nối tại client và server Mobile Interface được chia làm 2 module tại client và server. 2.5 Ứng dụng Petto Petto là ứng dụng phía client chạy trên môi trường điện thoại.4. 2. hình ảnh.com sau khi đã được chuẩn hóa dữ liệu để phù hợp với các thiết bị di động. Module trên server là một Interface sẽ tạo một socket. tin tức. nhận và phân phối các gói tin gửi về từ server và phân phối cho các form phía client.CNPM 83 . Điểm đặc biệt trong kết nối này là tạo được Mobile streaming cho dịch vụ mp3.công trong việc xây dựng hệ thống này. lắng nghe những packet từ client gửi lên. cho phép client có thể chơi nhạc trực tuyến với chất lượng ổn định. truyện. Hai module trên phía client và server sẽ tạo kết nối giựa trên giao thức kết nối socket TCP và luôn được giữ ổn định trong suốt quá trình client được bật. xử lý. Module trên client có nhiệm vụ quản lý các packet gửi đi. sau đó dựa vào mã gửi lên để gọi các service được cung cấp bởi Search Engine của trang Socbay.Khóa 50 .

Ứng dụng bao gồm các dịch vụ . Ứng dụng Petto được xây dựng trong đồ án này là một ứng dụng thuộc loại này. Mong muốn đưa ứng dụng tìm kiếm trên điện thoại lên iPhone nên ứng dụng Petto đã được xây dựng. 3. Kể từ khi ra mắt năm 2007 đến nay.CNPM 84 . Dịch vụ này cho phép người sử dụng có thể tra cứu.Utility Application: các ứng dụng tiện ích. hiển thị một tập các đặc tả của thông tin cho người dùng.Immersive Application: các ứng dụng mang tính giải trí (game). Màn hình hiển thị đơn giản và ít tương tác. xem lịch trên iPhone.Tin tức: cho phép xem danh mục các tin tức chia theo chủ đề và xem chi tiết của các tin tức đó. Ví dụ như các tiện ích thời tiết. đọc các thông tin trên các trang web di động ở mọi lúc mọi nơi. Ứng dụng tìm kiếm trên điện thoại di động Mobile Search của Socbay là một sản phẩm khá thành công nhưng mới chỉ sử dụng được trên các dòng điện thoại chạy Java. . . Áp dụng công nghệ tìm kiếm thông thường trên máy tính để bàn vào nền tảng di động.PHẦN II: XÂY DỰNG CHƯƠNG TRÌNH CHƯƠNG 3: ỨNG DỤNG TRÊN IPHONE 3. Thông tin được tổ chức theo cây phân cấp và người dùng có thể di chuyển qua lại giữa các mức. .1 Các loại ứng dụng trên iPhone Các ứng dụng trên iPhone được chia làm 3 loại . iPhone vẫn luôn là một hiện tượng và cũng là sản phẩm di động đi đầu về công nghệ.Productivity Application: Các ứng dụng sản phẩm giúp quản lý thông tin và hoàn thiện các tác vụ.2 Phát biểu bài toán Tìm kiếm di động là một dịch vụ giúp người sử dụng tìm kiếm thông tin trên điện thoại di động và các thiết bị không dây.Khóa 50 . Mục tiêu của dịch vụ tìm kiếm di động là đáp ứng tối đa nhu cầu tìm kiếm của người dùng ở mọi lúc mọi nơi.Truyện: đọc truyện Sinh viên thực hiện: An Thị Hồng .

.Hình ảnh .Cẩm nang tư vấn: chứa các thông tin hữu ích về văn hóa .Địa điểm: xem thông tin về các địa điểm .CNPM 85 .xã hội .Khóa 50 .Nhạc MP3 Sinh viên thực hiện: An Thị Hồng .

Đọc truyện theo chuyên mục Sinh viên thực hiện: An Thị Hồng .Xem chi tiết tin * Đọc truyện .Khóa 50 .CHƯƠNG 4: XÂY DỰNG CÁC DỊCH VỤ TÌM KIẾM ĐA PHƯƠNG TIỆN DỰA TRÊN MÁY TÌM KIẾM SOCBAY 4.1 Xác định yêu cầu hệ thống: Các chức năng chính của hệ thống được miêu tả như hình dưới: Hình 4.1 Usercase tổng thể của hệ thống * Chức năng Tin tức: .CNPM 86 .Xem tin tức theo chuyên mục .

Chọn nhạc theo chủ đê .CNPM 87 .Xem trước hình .Nghe nhạc 4.2 Đặc tả user case: 4.Xử lý dữ liệu nhận được từ máy Sinh viên thực hiện: An Thị Hồng .Gửi một request lên server lấy thông tin về .* Địa điểm . Tác nhân 1 Người dùng 2 thống Hệ Hành động Chọn chuyên mục hay tin chi tiết cần xem .Tìm kiếm địa điểm .Bắt các ngoại lệ nếu xảy ra . hiển thị tin chi tiết TT .Xem hình với kích thước thật * Nhạc Mp3 . Tin tức Tác nhân (actors) Mô tả Điều kiện đầu vào Kết quả đầu ra Luồng sự kiện Người sử dụng Use case cho phép người sử dụng đọc tin tức theo chuyên mục và đọc tin chi tiết Không Hiển thị tin theo chuyên mục.Khóa 50 .1.Đọc các thông tin tư vấn * Hình ảnh .2.Xem địa chỉ và giới thiệu về địa điểm * Cẩm nang tư vấn . .

Đọc truyện Tác nhân (actors) Mô tả Điều kiện đầu vào Kết quả đầu ra Luồng sự kiện Người sử dụng Use case cho phép người sử dụng tìm kiếm truyện theo chủ đề và đọc nội dung của truyện mà người dùng chọn Không Hiển thị truyện theo chủ đề.chủ trước khi hiển thị Luồng khác sự kiện Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng Các yêu cầu đặc .2.2 Đặc tả usercase dịch vụ Tin Tức 4. request gửi biệt lên server sẽ lấy về và hiển thị 10 kết quả.Xử lý dữ liệu nhận được từ máy chủ trước khi hiển thị Luồng khác sự kiện Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng Các yêu cầu đặc . Tác nhân 1 Người dùng 2 thống Hệ Hành động Chọn chủ đề hay truyện cụ thể muốn xem .Khóa 50 .Bắt các ngoại lệ nếu xảy ra .Gửi một request lên server lấy thông tin về .Khi người dùng yêu cầu xem một chủ đề. hiển thị nội dung truyện TT . Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp Sinh viên thực hiện: An Thị Hồng . Uses Extends Không Không Bảng 4. .2.Khi người dùng yêu cầu xem một chuyên mục. request biệt gửi lên server sẽ lấy về và hiển thị 10 kết quả.CNPM 88 . Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp 10 tin tiếp theo.

xem thông tin của địa điểm cụ thể Không Hiển thị địa điểm theo chủ đề.Khi người dùng yêu cầu xem một chuyên mục.3. .Bắt các ngoại lệ nếu xảy ra .Khi người dùng tiến sâu tới mức hiển thị lên danh sách các địa điểm thuộc chủ đề nào đó.Xử lý dữ liệu nhận được từ máy chủ trước khi hiển thị Luồng khác sự kiện Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng Các yêu cầu đặc .2.Gửi một request lên server lấy thông tin về .CNPM 89 . hiển thị thông tin của địa điểm cụ thể TT Tác nhân Hành động .3 Đặc tả usercase dịch vụ Truyện 4.Khóa 50 . dưới phần tên địa điểm sẽ có một chủ đề con chứa một số thông tin cơ bản về địa chỉ của địa Sinh viên thực hiện: An Thị Hồng . Địa điểm Tác nhân (actors) Mô tả Điều kiện đầu vào Kết quả đầu ra Luồng sự kiện Người sử dụng Use case cho phép người sử dụng tìm kiếm địa điểm theo chủ đề.10 tin tiếp theo. request biệt gửi lên server sẽ lấy về và hiển thị 10 kết quả. Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp 10 tin tiếp theo. Uses Extends Không Không Bảng 4. . 1 Người dùng 2 thống Hệ Chọn chủ đề hay địa điểm cụ thể cần xem thông tin .

điểm đó để người dùng không nhất thiết phải xem chi tiết về địa điểm.Khóa 50 .Bắt các ngoại lệ nếu xảy ra .Khi người dùng yêu cầu xem một chuyên mục. . Cẩm nang tư vấn Tác nhân (actors) Mô tả Điều kiện đầu vào Kết quả đầu ra Luồng sự kiện Người sử dụng Use case cho phép người sử dụng đọc thông tin theo chuyên mục và đọc chi tiết thông tin tư vấn Không Hiển thị thông tin theo chuyên mục. Uses Extends Không Không Bảng 4.CNPM 90 .4 Đặc tả usercase dịch vụ Địa điểm 4.Xử lý dữ liệu nhận được từ máy chủ trước khi hiển thị Luồng khác sự kiện Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng Các yêu cầu đặc . Uses Không Sinh viên thực hiện: An Thị Hồng . hiển thị chi tiết thông tin tư vấn TT Tác nhân Hành động . 1 Người dùng 2 thống Hệ Chọn chuyên mục hay tin chi tiết cần xem . Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp 10 tin tiếp theo.Gửi một request lên server lấy thông tin về .4. request biệt gửi lên server sẽ lấy về và hiển thị 10 kết quả.2.

5 Đặc tả usercase dịch vụ Cẩm nang tư vấn 4. 1 Người dùng 2 thống Hệ Chọn chủ đề hay ảnh muốn xem .Khi người dùng yêu cầu xem một chuyên mục. hiển thị ảnh xem trước. Nếu người dùng muốn xem thêm mới tiếp tục gửi request lên server để lấy tiếp 10 tin tiếp theo.Xử lý dữ liệu nhận được từ máy chủ trước khi hiển thị: tách phần thông tin ảnh ra khỏi các thông tin khác. . hiển thị ảnh lớn TT Tác nhân Hành động .Với các ảnh lớn hơn kích thước màn hình. .5. Hình ảnh Tác nhân (actors) Mô tả Điều kiện đầu vào Kết quả đầu ra Luồng sự kiện Người sử dụng Use case cho phép người sử dụng xem các chủ đề ảnh. xem hình ảnh đúng kích cỡ Không Hiển thị ảnh theo chủ đề.2. khôi phục lại ảnh ban đầu. thu nhỏ ảnh Sinh viên thực hiện: An Thị Hồng . request biệt gửi lên server sẽ lấy về và hiển thị 10 kết quả. Luồng khác sự kiện Nếu không lấy được dữ liệu về sẽ hiển thị thông báo cho người dùng Các yêu cầu đặc .Bắt các ngoại lệ nếu xảy ra .Gửi một request lên server lấy thông tin về .Khóa 50 .CNPM 91 . danh mục các ảnh kèm hình xem trước.Extends Không Bảng 4.

6.Khóa 50 . sau đó ấn nút chơi nhạc Hệ thống khởi tạo bộ chơi nhạc Hệ thống gửi yêu cầu chơi nhạc đến máy chủ Hệ thống nhận thông tin dưới dạng các gói tin từ máy chủ trả về 3 Người dùng Nhấn vào vị trí bất kì để seek trên thanh chỉ lượng nhạc đã được lấy về để chuyển tới vị trí bất kì trong bài nhạc Hệ thống kiểm tra nếu vị trí seek của người dùng nằm trong khoảng nhạc đã được lấy về thì cho phép chuyển đến vị trí đó còn không thì không cho phép. Nhạc MP3 Tác nhân (actors) Mô tả Điều kiện đầu vào Kết quả đầu ra Luồng sự kiện Người sử dụng Use case cho phép người sử dụng xem danh mục các bài nhạc theo chủ đề. người sử dụng có thể chọn nghe một bài nhạc Không Hiển thị kết quả tìm kiếm TT .2. 2 Hệ thống .lại cho vừa với kích thước màn hình Uses Extends Không Không Bảng 4. 92 4 Hệ thống Sinh viên thực hiện: An Thị Hồng .6 Đặc tả usercase dịch vụ Hình Ảnh 4. Tác nhân 1 Người dùng Hành động Chọn bản nhạc.CNPM .

Download dữ liệu trực tiếp từ URL . với giao thức HTTP. Cách này sẽ lấy dữ liệu theo kiểu không đồng bộ. đồng thời bắt được các lỗi xảy ra. Hơn nữa là tính trong suốt của ứng dụng client Sinh viên thực hiện: An Thị Hồng . Việc kết nối. .Sử dụng Socket * Download dữ liệu trực tiếp từ URL: đây là cách đơn giản nhất để nhận dữ liệu từ web server.CNPM 93 . chương trình sẽ bị dừng để chờ cho đến khi nó hoàn thành việc download dữ liệu. nhưng vơi các dữ liệu lớn thì nó sẽ dẫn tới việc người dùng không thể tương tác với ứng dụng cho đến khi dữ liệu được nhận về hết.3 Các vấn đề kỹ thuật.3. iPhone SDK cung cấp một số cách: . tức là khi hàm “withContentsOfURL” được gọi.1. Tuy nhiên. Tuy nhiên. Uses Extends Không Không Bảng 4. Như vậy khắc phục được nhược điểm của việc download trực tiếp từ URL. Với các dữ liệu nhỏ thì đây không phải là vấn đề. truyền nhận dữ liệu giữa client và server: Vấn đề đặt ra khi tạo ứng dụng là làm sao có thể tạo một kết nối giữa client (iPhone) và server (máy tìm kiếm Socbay). Tất cả những gì phải làm là truyền cho phương thức này một đối tượng NSURL chứa url và nó sẽ tạo và trả về một đối tượng chứa dữ liệu của url.Sử dụng giao thức HTTP gửi yêu cầu lên server và nhận dữ liệu về theo kiểu không đồng bộ.Luồng khác sự kiện Lỗi về đường dẫn : Hệ thống hiển thị thông báo lỗi trong trường hợp hệ thống không tìm thấy đường dẫn file hiện tại.Khóa 50 .7 Đặc tả usercase dịch vụ Nhạc MP3 4. Nó cũng không thể khống chế được luồng dữ liệu gửi lên và trả về như sử dụng kết nối socket. quá trình xử lý theo cách này là đồng bộ hóa. Sử dụng một lớp có phương thức khởi tạo (init) có tên chứa “withContentsOfURL:” Đây là các phương thức đặc biệt sẽ xử lý tất cả các việc để nhận dữ liệu từ Internet. thuật toán 4. * Sử dụng giao thức HTTP: gọi trực tiếp đến các service. làm chậm ứng dụng. mỗi lần người dùng muốn thực hiện một request lên server sẽ phải mất thời gian tạo lại kết nối.

Module server có trách nhiệm lắng nghe những gói tin được gửi lên từ client. thông tin bổ sung.Khóa 50 . Yêu cầu đặt ra là khi người dùng chọn một chuyên mục. người dùng có khả năng lựa chọn đi sâu xuống các mức ở dưới thấp hay trở lại các mức ở trên cao. người dùng có thể vào các chuyên mục con của chuyên mục đó. do là hiển thị một danh sách. 4. nhận về và hiển thị ra. MP3 streaming Với tác vụ MP3 streaming thì khá là khác so với các dịch vụ khác. Hiển thị Khi gửi yêu cầu lấy chuyên mục lên server. Việc gọi trực tiếp đến những server này sẽ không an toàn. Như vậy ứng dụng cần một navigation để chuyển đổi giữa các mức. và trong trường hợp muốn bảo trì và thay đổi sẽ làm ảnh hưởng đến toàn bộ hệ thống. những service như vậy thường được giữ trong suốt với tất cả các client để đảm bảo tính bảo mật và có khả năng thay đổi khi cần thiết. nên cần một đối tượng cho phép hiển thị cả text và hình ảnh. Quá trình streaming MP3: . * Sử dụng socket: người lập trình có thể điều khiển được việc truyền nhận dữ liệu theo kiểu đồng bộ hay không đồng bộ. UIWebView được sử dụng 4. ảnh preview.3. Các chuyên mục được tổ chức phân cấp.CNPM 94 .với các service cung cấp bởi Socbay Search Engine. Thông thường. Với cách thức này thì phải xây dựng 2 module client và server. hoặc nếu chuyên mục đó không còn chuyên mục con thì sẽ hiển thị thông tin chi tiết của nó. hay hình ảnh. text kèm hình ảnh.. cho phép người dùng chọn một phần tử trong danh sách đó. Do thông tin trả về có thể là chứa text. server sẽ trả về danh sách các chuyên mục tương ứng. Đối với việc hiển thị chi tiết. Rất may là iPhone SDK cung cấp đối tượng UITableView đáp ứng được các yêu cầu này. xử lý.3.3. Mỗi phần tử của chuyên mục cần có tiêu đề (của chuyên mục con hay tin chi tiết). Module client các trách nhiệm tạo thread để xử lý các dữ liệu trả về từ server. có khả năng tùy biến cho phép người dùng điều khiển việc hiển thị. sau đó gọi và lấy thông tin từ service được cung cấp bởi Socbay Search Engine và trả lại cho client. với MP3 streaming thì còn cần phải chuyển dữ liệu nhận được từ server về thành các packet âm thanh để có thể phát lại ngay mà không cần phải download toàn bộ bài hát về. Không phải là chỉ gửi request lên server.Gửi request lên server và nhận dữ liệu trả về là dãy các byte Sinh viên thực hiện: An Thị Hồng .2. Đối với các chuyên mục. đồng thời kiểm soát được luồng dữ liệu gửi lên và trả về.

buffer này sẽ được đưa vào một hàng đợi để chuẩn bị phát lại. . thì các gói âm thanh sẽ phải đợi khi có buffer trống để được đẩy vào. .Các gói âm thanh được lần lượt đẩy vào một buffer . nó sẽ đẩy các buffer cho đối tượng AVAudioPlayer để phát lại. tập hợp lại thành cách gói âm thanh. và các buffer thì phải “xếp hàng lần lượt” để đến khi mình được phát lại. AVAudioPlayer không kịp xử lý hết..Nếu dữ liệu gửi về quá nhanh. nó giải phóng hết dữ liệu đang giữ và quay trở lại chờ nhận dữ liệu mới. sau một buffer được phát lại. .CNPM 95 .Với hàng đợi buffer.Khóa 50 .2 MP3 Streaming Sinh viên thực hiện: An Thị Hồng . Hình 4.Khi buffer đầy.Sử dụng dịch vụ Audio File Stream để phân tích dãy byte nhận về.

Giao diện chính: Hình 4.CNPM 96 .1.4 Thiết kế giao diện: 4.4.Khóa 50 .3 Giao diện chính của ứng dụng Sinh viên thực hiện: An Thị Hồng .4.

4. Dịch vụ Truyện: Hình 4.4. Dịch vụ Tin Tức: Hình 4.2.4 Giao diện chính của dịch vụ Tin Tức 4.4.Khóa 50 .CNPM 97 .5 Giao diện chính của dịch vụ Truyện Sinh viên thực hiện: An Thị Hồng .3.

6 Giao diện chính của Địa Điểm 4.7 Giao diện chính của dịch vụ Cẩm Nang Tư Vấn Sinh viên thực hiện: An Thị Hồng .4.4.Khóa 50 .CNPM 98 .4.4.5. Dịch vụ Địa Điểm: Hình 4. Dịch vụ Cẩm Nang Tư Vấn: Hình 4.

4.6.CNPM 99 .7. Dịch vụ Hình Ảnh: Hình 4.9 Giao diện chính của dịch vụ Nhạc MP3 Sinh viên thực hiện: An Thị Hồng .Khóa 50 .4.8 Giao diện chính của dịch vụ Hình Ảnh 4. Dịch vụ Nhạc MP3: Hình 4.4.

CNPM 100 .10 Biểu đồ lớp của tầng ứng dụng Cocoa Touch Để thấy rõ các thuộc tính và phương thức của các lớp.4.1. Lớp ứng dụng: Sinh viên thực hiện: An Thị Hồng .Khóa 50 . Nhằm mục đích đơn giản hóa nên các liên kết với các phần khác sẽ được giản lược đi.5. Tầng Cocoa Touch Application Hình 4.5 Thiết kế lớp: 4. Và vì các lớp được xây dựng khá là tương đồng nhau nên em xin phép chỉ trình bày các lớp ứng dụng và các lớp trong dịch vụ Tin Tức và Nhạc MP3 1. biểu đồ lớp sẽ được chia nhỏ thành các phần.

Lớp MainViewController: hiển thị giao diện chính của chương trình. + Tùy thuộc vào lựa chọn của người sử dụng chuyển đến chức năng tương ứng.Khóa 50 . tùy thuộc vào lựa chọn của người dùng mà chuyển đến chức năng tương ứng.11 Biểu đồ lớp của lớp ứng dụng .Hình 4.Lớp ApplicationDelegate có nhiệm vụ nhận các sự kiện liên quan tới vòng đời của ứng dụng và đáp ứng lại các sự kiện này + applicationDidFinishLauching: sự kiện này xảy ra ngay sau khi khởi đầu ứng dụng + applicationWillTerminate: sự kiện này xảy ra ngay trước khi đóng ứng dụng . tạo ngay một kết nối socket tới server.CNPM 101 . Sinh viên thực hiện: An Thị Hồng . + Khi ứng dụng được mở ra. lớp MainViewController được khởi tạo.

UInt32) : void parserIntToCharArray(UInt32) : char* createRequestData() : char* reloadTableData(NSNotification*) : void scrollViewDidEndDecelerating(UIScrollView*) : void viewDidLoad() : void numberOfSectionsInTableView(*UITableView) : NSInteger tableView:cellForRowAtIndexPath(NSInteger.CNPM 102 . UInt32) : void parserIntToCharArray(UInt32) : char* reloadTableData(NSNotification*) : char* TinTucTinMoi View Controller # # # + cate_id: UInt32 key: UInt32 socket: Socket* spinner: UIActivityIndicatorView* start: UInt32 tinMoiController: NSMutableArray* numGet: UInt32 connectSocketWithParameter(UInt32. Dịch vụ Tin Tức: class Dich v u Tin Tuc TinTucChuyenMuc View Controller + *socket: Socket *spinner: UIActivityIndicatorView *tinTucController: NSMutableArray parent_id: UInt32 start: UInt32 numGet: UInt32 connectSocketWithParameter(UInt32. UInt32. UITableView*) TinTucChiTiet View Controller + socket: Socket* spinner: UIActivityIndicatorView* item_id: UInt32 webView: UIWebView* connectSocketWithItem_id(UInt32) : void reloadData(NSNotification*) : void parserIntToCharArray(UInt32) : char* createRequestData() : char* viewDidLoad() : void dealloc() : void Hình 4. UInt32.2.Khóa 50 . UInt32.12 Biểu đồ lớp của dịch vụ Tin Tức Sinh viên thực hiện: An Thị Hồng .

Sinh viên thực hiện: An Thị Hồng . đối tượng sẽ gửi một request lên server thông qua hàm connectionSocketWithParameter với các tham số truyền vào chỉ rõ yêu cầu chuyên mục thuộc chuyên mục cha nào.Lớp TinTucChiTietViewController: hiển thị tin tức chi tiết. .Lớp TinTucTinMoiViewController: hiển thị danh sách cách chuyên mục không có chuyên mục con..Khóa 50 . lấy bao nhiêu phần tử.CNPM 103 . .Lớp TinTucChuyenMucViewController: hiển thị danh sách các chuyên mục có chuyên mục con. + Mỗi khi một đối tượng của lớp TinTucChuyenMucViewController được khởi tạo. bắt đầu từ phần tử nào.

Khóa 50 .3. Dịch vụ nhạc MP3 class Dich v u nhac MP3 MP3ChuyenMuc View Controller + socket: Socket* mp3ChuyenMucViewController: NSMutableArray* spinner: UIActivityIndicatorView* parent_id: UInt32 numGet: UInt32 start: UInt32 connectSocketWithParameter(UInt32.CNPM 104 .13 Biểu đồ lớp của dịch vụ Nhạc MP3 Sinh viên thực hiện: An Thị Hồng . UInt32. UInt32) : void parserIntToCharArray(UInt32) : char* scrollViewDidEndDecelerating(UIScrollView*) : void createRequestData() : char* reloadTableData(NSNotification*) : void viewDidLoad() : void numberOfSectionsInTableView(UITableView*) : NSInteger dealloc() : void MP3Player + + + + button: UIButton* volumeSlider: UIView* positionLabel: UILabel* durationLabel: UILabel* progressSlider: UISlider* streamer: AudioStreamer* progressUpdateTimer: NSTimer* urlString: NSString * buttonPressed(id) : IBAction spinButton() : void updateProgress(NSTimer*) : void sliderMoved(UISlider*) : IBAction setButtonImage(UIImage*) : void createStreamer() : void destroyStreamer() : void viewDidLoad() : void playbackStateChanged(NSNotification*) : void dealloc() : void MP3DanhSach View Controller + socket: Socket* mp3DanhSachController: NSMutableArray spinner: UIActivityIndicatorView* key: UInt32 cate_id: UInt32 bitRate: UInt32 dataOffset: NSInteger fileLength: NSInteger seekByteOffset: NSInteger audioDataByteCount: UInt64 processedPacketsCount: UInt64 processedPacketsSizeTotal: UInt64 seekTime: double sampleRate: double packetDuration: double lastProgress: double connectSocketWithKey(UInt32. UInt32) : void parserIntToCharArray(UInt32) : char* createRequestData() : char* reloadTableData(NSNotification) : void viewDidLoad() : void dealloc() : void AudioStreamer + + + + + + + + + + url: NSURL* audioQueue: AudioQueueRef audioFileStream: AudioFileStreamID asbd: AudioStreamBasicDescription internalThread: NSThread* audioQueueBuffer: AudioQueueBufferRef[] packetDescs: AudioStreamPacketDescription[] fillBufferIndex: unsigned int bytesFilled: size_t packetsFilled: size_t inuse: bool[] buffersUsed: NSInteger httpHeaders: NSDictionary* state: AudioStreamerState stopReason: AudioStreamerStopReason errorCode: AudioStreamerErrorCode err: OSStatus discontinuous: bool queueBuffersMutex: pthread_mutext_t queueBufferReadyCondition: pthread_cond_t notificationCenter: NSNotificationCenter* initWithURL(NSURL*) : id start() : void pause() : void stop() : void isPaused() : BOOL isIdle() : BOOL isWaiting() : BOOL isPlaying() : BOOL seekToTime(double) : void calculatedBitRate() : double MP3TinTuc View Controller + socket: Socket* spinner: UIActivityIndicatorView* item_id: UInt32 webView: UIWebView* connectSocketWithItem_id(UInt32) : void reloadData(NSNotification*) : void parserIntToCharArray(UInt32) : char* createRequestData() : char* viewDidLoad() : void dealloc() : void Hình 4.

CFReadStreamRef) : void dealloc() : void Packet + + + + + + + + + packetHeader: RequestHeader_t* packetData: char* packetBytesArray: UInt8* image: UInt8* image_length: UInt32 allocateHeader() : void packetSetHeaderData(UInt8*) : void allocatePacketBytesArrayWithDataLength(unsigned int) : void copyCharBytesToBuffer(int. CFStreamEventType. char*) : void analyzePacketDataToCategoryReceiveData(CategoryReceive_t) : void analyzePacketDataToSearchResultReceiveData(SearchResultReceive_t) : void analyzePacketDataToDetailReceiveData(DetailReceive_t ) : void Hình 4. lớp packet sẽ nhận nhiệm vụ phân tích dữ liệu lấy về thành thông tin hữu ích để có thể hiển thị lên màn hình. char*. UInt8*.Lớp Socket có nhiệm vụ tạo một kết nối socket tới server. Tầng Mobile Interface: class MobileInterfaceClass Socket + + + + writeStream: CFWriteStreamRef readStream: CFReadStream packetArray: NSMutableArray* initWithNoData() : void startStreamToHost(int. char*.Lớp Packet chứa thông tin về một gói thông tin tương ứng với một request của client hay một trả lời của server. gửi request lên server và nhận về trả lời của server. int.Khóa 50 .14 Biểu đồ lớp của tầng Mobile Interface . UInt8*. int. . UInt8*. UInt8*) : void copyIntBytesToBuffer(int. int. UInt8*) : void createClientRequestWithCode(int. int. Với trả lời của server. int. UInt8*.4.CNPM 105 . UInt8*. Sinh viên thực hiện: An Thị Hồng . char*) : void destroySocketConnection() : void readStreamCallback(void*.2.5. int. NSString*) : void startWriteStreamWithCode(UInt8*.

CNPM 106 .Khóa 50 . Quan hệ giữa tầng Mobile Interface và Cocoa Touch Application: Mỗi lớp của tầng Cocoa Touch Application đều chứa một biến thành phần là thể hiện của lớp Socket.4.3. và một mảng chứa các thể hiện của lớp Packet thuộc tầng Mobile Interface. Sinh viên thực hiện: An Thị Hồng .5.

Chưa có chức năng cho người dùng nhập từ khóa vào và tìm kiếm. Một số kết quả đạt được Về cơ bản đã tìm hiểu được những kiến thức cơ bản nhất về môi trường lập trình cho điện thoại iPhone. Một số ưu điểm của ứng dụng • • • Giao diện bắt mắt người sử dụng. hoặc các dịch vụ giá trị gia tăng mới (như nhắn tin)… 2 Nhược điểm Tuy đã cố gắng hoàn thiện sản phẩm ở mức tốt nhất tuy nhiên ứng dụng không tránh khỏi những mặt hạn chê: • Dữ liệu được chuẩn hóa cho thiết bị di động cũng không tránh khỏi sai sót.Khóa 50 .. Ứng dụng Petto đã được xây dựng tương đối hoàn thiện với các chức năng được đặt ra. chẳng có cách nào khác là phải tự tìm trong danh sách các chuyên mục hiển thị ra. • Việc tìm kiếm mới chỉ dừng ở mức tĩnh. Ví dụ như dịch vụ tin tức.TỔNG KẾT ĐÁNH GIÁ 1. ứng dụng vẫn chưa có cách xử lý. Hiểu được cấu trúc một chương trình ứng dụng trên iPhone và có thể tự xây dựng một chương trình của riêng mình. kết nối và truyền nhận dữ liệu sai. nhưng vẫn chưa bắt được time out. Nếu như việc kết nối socket thành công nhưng nếu quá trình truyền nhận dữ liệu quá lâu. • Việc sử dụng socket và stream để trao đổi dữ liệu giữa client và server được thiết lập và bắt được các lỗi cơ bản như không có kết nối mạng. tức là người dùng chỉ có thể lựa chọn trên danh sách các mục hiển thị ra. • Ứng dụng có khả năng tích hợp nhanh chóng đối với các dịch vụ tìm kiếm. Cung cấp cho người dùng nhiều dịch vụ để có thể chọn lựa Có khả năng hiển thị tiếng Việt. người dùng muốn xem thông tin trong mục tin mới nhất. Sinh viên thực hiện: An Thị Hồng .CNPM 107 .

hình ảnh Sinh viên thực hiện: An Thị Hồng . upload hình ảnh. • Nghiên cứu. tiến tới việc cho xem video online trên môi trường thiết bị di động. ứng dụng sẽ tập trung vào việc nâng cấp các tính năng hiện có. giải quyết các vấn đề còn tồn tại. bổ sung các tính năng mới để có thể đáp ứng được nhu cầu của thị trường. bóng đá. • Cho phép người dùng khả năng tương tác với hệ thống như upload thông tin rao vặt.Khóa 50 .• Dịch vụ ảnh.CNPM 108 . nhạc…. • Bổ sung thêm dịch vụ chứng khoán. cải tiến tính năng chơi nhạc của ứng dụng. 3 Hướng phát triển: Trong thời gian tới. • Cho phép người dùng download nhạc. nghe nhạc MP3 chưa còn chưa có chức năng download.

com/iphone/index. Inc.Exploring the iPhone SDK . Appress.2009 4.CNPM 109 . 1st Edition. iPhone Developer: http://developer. More iPhone 3 Development . 6. Jiva DeVoe.action của Apple 2. iPhone SDK Programming . Inc. James A.TÀI LIỆU THAM KHẢO 1. 5. 2009. Beginning iPhone 3 Development .Khóa 50 .apple. iPhone SDK Application Development. O’Reilly Media. Appress. 2009 Sinh viên thực hiện: An Thị Hồng . Dave Mark| Jeff LaMache. McGraw-Hill.Tackling iPhone SDK 3 .Brannan. Cocoa Touch for iPhone OS 3. Wiley Publishing. Jonathan Zdziarski.A Beginning’s Guide. 2010. Dave Mark| Jeff LaMache.2009 3.

You're Reading a Free Preview

Tải về
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->