Như bạn đã nêu trong kế hoạch, XML và REST của bạn là một cách tuyệt vời để giao tiếp với một ứng dụng web. Tôi muốn gợi ý một vài chi tiết về cách thiết kế và xây dựng nó, hoặc những gì bạn nên ghi nhớ.
Trước hết, tôi tin rằng điều quan trọng là phải gắn bó với MVC. Tôi đã thấy mọi người tạo kết nối HTTP trong bộ điều khiển xem, bộ điều khiển là đại diện của NSXMLParser, bộ điều khiển chứa dữ liệu trong các biến thành viên. Tôi thậm chí đã nhìn thấy UITableCells thiết lập kết nối HTTP. Đừng làm thế!
Mô hình của bạn và mã thao tác cơ bản của nó phải được trích xuất nhiều từ giao diện người dùng nhất có thể. Vì bạn đã tạo mô hình trong ứng dụng web của mình, hãy thử tạo lại các thực thể trong dự án iPhone của bạn. Đừng ngại có một số phương thức đơn giản trong các lớp thực thể, nhưng không làm cho chúng sử dụng các tài nguyên bên ngoài, đặc biệt là các kết nối TCP. Ví dụ về các phương thức trong lớp thực thể, bạn có thể có các phương thức định dạng dữ liệu theo các cách cụ thể (ngày làm ví dụ hoặc trả về tên đầy đủ dưới dạng nối của họ và tên) hoặc thậm chí bạn có thể có một phương thức như - (void)update
. để gọi lớp chịu trách nhiệm cập nhật mô hình.
Tạo một lớp khác để cập nhật mô hình - tìm nạp XML từ ứng dụng web. Thậm chí không cân nhắc việc sử dụng các kết nối đồng bộ, thậm chí không phải từ một chuỗi chuyên dụng. Kết nối không đồng bộ với đại biểu là con đường để đi. Đôi khi, nhiều yêu cầu cần được thực hiện để nhận tất cả dữ liệu bắt buộc.Bạn có thể muốn tạo một số loại máy trạng thái để giữ thông tin về giai đoạn tải xuống của bạn và tiến bộ từ giai đoạn này sang giai đoạn khác, bỏ qua đến cuối nếu xảy ra lỗi, thực thi lại từ giai đoạn không thành công sau một vài khoảnh khắc.
Tải xuống dữ liệu ở đâu đó tạm thời và trước tiên khi bạn có dữ liệu, hãy chuyển đổi và cập nhật giao diện người dùng. Điều này giúp đáp ứng trong khi khởi chạy ứng dụng - người dùng sẽ làm việc ngay lập tức với dữ liệu được lưu trữ cục bộ, trong khi cơ chế cập nhật đang tải xuống dữ liệu mới.
Nếu bạn cần tải xuống nhiều tệp, hãy thử tải xuống đồng thời, nếu phụ thuộc giữa các tệp cho phép điều đó. Điều này liên quan đến việc tạo ra một kết nối cho mỗi yêu cầu, có thể là ví dụ đại biểu cho mỗi người trong số họ. Tất nhiên bạn có thể chỉ có một cá thể ủy nhiệm cho tất cả các kết nối đó, nhưng nó phức tạp hơn một chút để theo dõi dữ liệu. Việc tải xuống đồng thời có thể làm giảm đáng kể độ trễ, giúp cơ chế này nhanh hơn nhiều cho người dùng.
Để tiết kiệm thời gian và băng thông, hãy xem xét sử dụng tiêu đề If-Modified-Since
và/hoặc ETag
của HTTP. Hãy nhớ thời gian hoặc thẻ khi bạn yêu cầu dữ liệu lần cuối cùng và lần sau gửi dữ liệu đó trong tiêu đề của HTTP. Ứng dụng web của bạn phải trả lại mã HTTP 304 nếu nội dung chưa bị thay đổi. Ứng dụng iPhone sẽ phản ứng trên mã này tương ứng trong connection:didReceiveResponse:
.
Tạo một lớp chuyên dụng để phân tích cú pháp XML và cập nhật mô hình. Bạn có thể sử dụng NSXMLParser, nhưng nếu tệp của bạn không lớn, tôi khuyên bạn nên dùng TouchXML, thật vui khi làm việc với XML dưới dạng tài liệu (nó cũng hỗ trợ XPath), thay vì API dựa trên sự kiện. Bạn cũng có thể sử dụng trình phân tích cú pháp này khi các tệp được tải xuống để kiểm tra tính hợp lệ của chúng - tải xuống lại nếu phân tích cú pháp không thành công. Đó là khi lớp dành riêng cho phân tích có ích.
Nếu tập dữ liệu của bạn không lớn, nếu bạn không cần lưu dữ liệu tải xuống vĩnh viễn trên iPhone, bạn có thể không cần lưu trữ chúng trong cơ sở dữ liệu SQLite, bạn có thể lưu trữ chúng ở định dạng XML. . Điều đó ít nhất có thể là cách cho một ứng dụng twitter. Nó dễ dàng hơn theo cách đó, nhưng đối với các tập dữ liệu lớn hơn XML tiêu thụ rất nhiều bộ nhớ và sức mạnh xử lý - trong trường hợp đó, SQLite là tốt hơn.
Tôi khuyên bạn nên sử dụng Dữ liệu cốt lõi, nhưng bạn đề cập đến đây là ứng dụng iPhone đầu tiên của bạn, vì vậy tôi khuyên bạn không nên sử dụng nó. Chưa.
Đừng quên đa nhiệm - ứng dụng của bạn có thể chuyển sang chế độ ngủ khi đang tải xuống, bạn cần hủy kết nối và dọn dẹp cơ chế cập nhật của mình. Khi bạn thức dậy, bạn có thể muốn tiếp tục cập nhật.
Về phần xem của ứng dụng - sử dụng Trình tạo giao diện. Nó có thể gây đau đớn ngay từ đầu, nhưng nó sẽ giảm giá trong thời gian dài.
Xem bộ điều khiển là keo giữa mô hình và chế độ xem. Không lưu trữ dữ liệu trong đó. Hãy suy nghĩ hai lần về những gì để thực hiện ở đâu, và ai nên gọi nó.
Điều này không liên quan đến kiến trúc của ứng dụng, nhưng tôi muốn nhắc nhở rằng Mục tiêu-C là ngôn ngữ rất biểu cảm. Mã nên đọc giống như một câu. Mở rộng các lớp với các giao thức. Ví dụ như ngày khác tôi cần dòng đầu tiên của một chuỗi. Chắc chắn, bạn có thể viết một lớp lót nơi bạn tìm thấy lần xuất hiện đầu tiên của một dòng mới và nhận chuỗi con từ đầu đến đó. Nhưng có vẻ không đúng. Tôi đã thêm - (NSString*)firstLine
vào giao thức NSString của tôi. Mã trông đẹp hơn rất nhiều theo cách này, nó không cần bất kỳ bình luận nào.
Có rất nhiều điều cần xem xét trong cả kiến trúc và thiết kế của bất kỳ dự án nào, cả hai đều nên đi đôi với nhau. Nếu một người gây rắc rối cho người khác, bạn cần phải thích nghi. Không có gì được viết bằng đá.
Có phải cơ sở dữ liệu SQLite giống nhau cho tất cả người dùng không? Hoặc là nó cụ thể cho mỗi người dùng? Cơ sở dữ liệu/dữ liệu sẽ lớn như thế nào đối với bản sao ban đầu và lần tải xuống sau? – baalexander
cơ sở dữ liệu SQLite sẽ chỉ lưu trữ phiên bản nguồn cấp dữ liệu địa phương hóa, dữ liệu được lấy từ cơ sở dữ liệu mySQL trung tâm. Đối với việc tìm nạp nội tạng, tôi đoán tôi có thể kiểm soát mức độ lớn mà tôi muốn khi tôi có thể đặt số lượng các mục nguồn cấp dữ liệu trước đó có được, đó chỉ là văn bản. – barfoon
Chỉ là một ghi chú lịch sử. Trong nhiều năm ** ASIHTTPRequest ** là giải pháp goto trong vũ trụ iOS, phổ biến nhất và tốt nhất trong tất cả các thư viện iOS! Thật không may nó không còn với chúng tôi những ngày này, nhưng nó là một cái gì đó đặc biệt. Ah, kỷ niệm! – Fattie