2012-04-15 41 views
6

Tôi mới phát triển iOS, vì vậy tôi sẽ đánh giá cao một số phản hồi.Giao tiếp giữa Mô hình và Bộ điều khiển - iOS

Tôi đang cố gắng xây dựng ứng dụng khách iOS cho dịch vụ web của mình. Cho đến nay đây là những gì tôi đã làm:

Tôi đang triển khai hai chế độ xem (Ứng dụng dựa trên tiện ích sử dụng Storyboard). Trong giao diện chính, tôi sử dụng một trường văn bản và nút tìm kiếm, nơi người dùng có thể nhập truy vấn và sau đó nhấp vào nút tìm kiếm. Khi nút tìm kiếm được nhấp, ý định của tôi là đọc giá trị của trường văn bản và sử dụng nó trong lời gọi Restful của tôi đến dịch vụ web của tôi. Dịch vụ web của tôi trả lời lại bằng một tệp JSON có kết quả truy vấn, mà tôi phân tích và hiển thị cho vùng văn bản của chế độ xem phụ.

Tôi biết cách thực hiện cuộc gọi yên tĩnh trong iOS và cách thực hiện phân tích cú pháp JSON cũng như hiển thị kết quả trên màn hình (ít nhất là văn bản, nhưng đó là một câu hỏi khác). Nhưng ý định của tôi là tìm hiểu và thực hiện những điều cơ bản về MVC cho ứng dụng của tôi.

Theo MVC, bộ điều khiển cập nhật chế độ xem và mô hình gửi một thông báo mà bộ điều khiển có thể nghe và biết nếu có bất kỳ thay đổi nào trong đối tượng. Vì vậy, đây là những gì tôi lý tưởng muốn làm:

Mô hình của tôi - Mô hình của tôi sẽ xử lý cuộc gọi RESTful cốt lõi, nhận trả lời JSON, phân tích cú pháp và nhận giá trị kết quả mà tôi muốn hiển thị trên màn hình.

Bộ điều khiển của tôi - Tôi muốn bộ điều khiển của mình nghe mô hình của mình và nhận được các giá trị kết quả từ Mô hình và hiển thị chúng trên Chế độ xem.

Sử dụng một cách nhanh chóng và bẩn, tôi có thể thực hiện cuộc gọi RESTful, phân tích cú pháp JSON và hiển thị giá trị kết quả - tất cả bên trong Bộ điều khiển, nhưng với kỹ thuật này, nếu chế độ xem của tôi thay đổi vào ngày mai thì tôi phải viết lại mã của mình . Hoặc nếu tôi muốn thêm các tính năng mới, thì tôi phải thay đổi bộ điều khiển của mình. Vì vậy, lý tưởng tôi muốn có một mô hình cốt lõi không nhận thức được cách nhìn như thế nào, và chỉ cần cho bộ điều khiển lấy kết quả từ Model và hiển thị chúng trên View.

Từ những gì tôi đã đọc từ kết quả tìm kiếm của Google cho đến nay, hai cách để thực hiện việc này là a) Quan sát giá trị khóa và b) Trung tâm thông báo.

Trong 2 ngày qua, tôi đang cố gắng tìm cách tốt để triển khai Trung tâm thông báo hoặc đọc thêm về trung tâm thông báo, tôi không nhận được khách hàng tiềm năng tốt. Một số câu hỏi tôi có là, tôi có thể gửi giá trị kết quả chuỗi bằng cách sử dụng Trung tâm thông báo mà bộ điều khiển của tôi chọn không? Trung tâm thông báo thực sự hoạt động như thế nào với các giá trị chuỗi? Tôi có thể tìm thấy một số ví dụ tốt ở đâu?

Vì vậy, bất kỳ trợ giúp nào về vấn đề này sẽ được đánh giá rất nhiều.

+1

Bạn thực sự muốn MODEL của mình xử lý giao tiếp với dịch vụ RESTful? – Till

Trả lời

12

Một số trong những câu hỏi tôi có được, tôi có thể gửi ra String kết quả giá trị sử dụng trung tâm thông báo rằng bộ điều khiển của tôi nhặt?

Có, thường được thực hiện bằng cách sử dụng thuộc tính userInfo của NSNotification. userInfo là đồng bằng NSDictionary có thể chứa các thể hiện của các đối tượng bắt nguồn là NSObject được lập chỉ mục bằng các khóa tuân thủ giao thức NSCopying (thường được sử dụng NSString). Lưu ý rằng từ điển (userInfo) sẽ giữ lại đối tượng tham số của bạn.


Trung tâm thông báo thực sự hoạt động với giá trị chuỗi như thế nào?

Vâng, điều đó phụ thuộc vào cách bạn muốn nó hoạt động. Nhưng hãy gạt sang một bên, xem bên dưới.


Tôi có thể tìm thấy một số ví dụ điển hình ở đâu?

Có lẽ một trong này sẽ giúp ...


Ví dụ

Người nhận (điều khiển) đăng ký cho thông báo:

- (void)registerForNotifications 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(modelObjectUpdatedString:) 
               name:@"StringUpdated" 
               object:nil]; 
} 

Người gửi (mô hình) thông báo thế giới:

- (void)stringUpdateWith:(NSString *)theString 
{ 
    self.string = theString; 
    [[[NSNotificationCenter defaultCenter] postNotificationName:@"StringUpdated" 
                 object:self 
                 userInfo:[NSDictionary dictionaryWithObjectsAndKeys:self.string, @"String", nil]]; 
} 

Người nhận (điều khiển) nhận được thông báo trong vòng xử lý của nó:

- (void)modelObjectUpdatedString:(NSNotification *)notification 
{ 
    ModelObject *postingObject = [notification object]; 
    NSString *string = [[notification userInfo] 
     objectForKey:@"String"]; 
    ... 
} 
+2

Đây là một câu trả lời hoàn hảo. Cảm ơn bạn rất nhiều vì đã có câu trả lời rõ ràng và súc tích. Điều này thật đúng với gì mà tôi đã tìm kiếm. – BlueChips23

4

Bạn đang nghĩ dọc theo con đường đúng đắn, nhưng vẫn không hoàn toàn. Như Till "chỉ ra" trong bình luận của mình, bạn không nên xử lý các giao tiếp RESTful bên trong mô hình của bạn. Nếu tôi là bạn, tôi sẽ tạo một lớp tiện ích chịu trách nhiệm tìm nạp thông tin, và sau đó một lớp chịu trách nhiệm giữ dữ liệu (lớp cuối cùng này là mô hình của bạn). Nó sẽ là thông minh để tạo ra một phương thức lớp phân bổ và khởi tạo một thể hiện mới của đối tượng này, được tạo từ dữ liệu JSON được tìm nạp thông qua lớp giao tiếp RESTful của bạn.

Từ bạn điểm điều khiển của xem:

RESTHelper *rest = [RESTHelper restHelperWithURL:yourRESTURL]; 
YourModel *model = [YourModel modelWithJSON:[rest fetchObjectWithID:1]]; 
// Present your models data in the view. 

Bạn có thể hưởng lợi từ việc sử dụng CoreData ở đây, và tôi khuyến khích bạn nhìn vào đó.

+0

Mẹo hay tại đây. Cảm ơn bạn đã hướng dẫn tôi đi đúng hướng. Đây là những loại phản hồi mà tôi đã hy vọng nhận được, vì tôi mới phát triển iOS và tôi muốn có được những điều cơ bản đúng đắn trước khi thực hiện bất kỳ ứng dụng phức tạp nào. – BlueChips23

+0

Bạn không nên sử dụng NSNotificationCenter trừ khi bạn có trường hợp khối, KVO hoặc ủy quyền không thể thực hiện công việc. –

+0

Hi Rasmus, tôi cũng bắt tay với IOS. (Không quá mới đối với OO). Sau đó, bạn có gợi ý rằng lớp restHelper "Gọi lại" cho một giao thức trên Mô hình, khi nó có một số dữ liệu? Và bạn có thể giải thích lý do tại sao bạn sử dụng [rest fetchObjectWithID: 1]? Tôi biết tôi đã xem qua nó trong các video của Stanford, nhưng có vẻ như tôi đã phá hủy những tế bào não đó ... – Greycon

Các vấn đề liên quan