2008-12-03 9 views
58

Tôi đang tìm cách có thể tham khảo một số trạng thái/đối tượng nhất định thông qua bất kỳ đâu trong ứng dụng của tôi. Ví dụ, một người dùng đăng nhập vào ứng dụng của họ, tôi cần gọi một dịch vụ web và truy xuất thông tin người dùng. Sau đó, tôi muốn có thể truy cập thông tin này từ bất cứ nơi nào trong ứng dụng với một cái gì đó như sau:Việc sử dụng ứng dụng phù hợp cho iPhone

myAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
user = delegate.u; 

là thiết lập một biến Ví dụ như một đối tượng người dùng trong các đại biểu ứng dụng và tham khảo nó từ đó khi cần một người nghèo cách đi về nó? Tôi thường đặt nó ở đó khi đăng nhập của người dùng.

Muốn nghe các chuyên gia xử lý vấn đề này như thế nào.

Trả lời

52

Thông thường, bạn chỉ nên gắn cái gì đó để các đại biểu ứng dụng nếu họ:

  • được tạo ra từ các tập tin NIB giống như các đại biểu ứng dụng (tức là các yếu tố UI tĩnh trong giao diện cửa sổ duy nhất)
  • có liên quan với xử lý sự kiện cấp ứng dụng đi qua ứng dụng đại biểu (như mục trình đơn cho Cửa sổ Tuỳ chọn)

Đối với mọi thứ khác, bạn nên tạo một singleton quản lý quyền truy cập vào chúng.

Jason Coco đề xuất định tuyến thông qua Bộ điều khiển ứng dụng. Trong các chương trình của tôi, tôi thường tránh điều này, vì tôi nghĩ rằng nó đặt quá nhiều trách nhiệm ở cấp cao nhất - tôi nghĩ mọi thứ nên tự quản lý khi có thể và quản lý cấp cao hơn chỉ nên được sử dụng khi có yêu cầu phối hợp giữa mô-đun cấp.

Tôi sẽ không liên kết blog của riêng tôi nhưng nếu bạn Google và những người độc thân, bạn có thể sẽ tìm thấy bài đăng tôi đã viết chi tiết hơn.

+1

Cảm ơn Matt. Hãy nhớ nếu tôi hỏi cụ thể những gì bạn đang đề cập đến khi bạn nói mục trình đơn cho Cửa sổ Tùy chọn? – Coocoo4Cocoa

+1

Rất thích đọc blog của bạn Matt, nhưng tiếc là không phải lúc này. Hy vọng nó là tạm thời. – Coocoo4Cocoa

+6

Liên kết tới bài đăng trên blog: http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html – Casebash

13

Tôi không thấy bất kỳ vấn đề nào với cách tiếp cận của bạn. Tôi thường sử dụng một singleton để xử lý tình trạng này:

// MyCommon.h: 
@interface MyCommon 
class MyCommon : NSObject 
{ 
    int user; 
}; 

@property(assign) int user; 

+ (MyCommon *)singleton; 

@end 

// MyCommon.m: 
@implementation MyCommon 

static MyCommon * MyCommon_Singleton = nil; 

+ (MyCommon *)singleton 
{ 
    if (nil == MyCommon_Singleton) 
    { 
     MyCommon_Singleton = [[MyCommon_Singleton alloc] init]; 
    } 

    return MyCommon_Singleton; 
} 
@end

Các MyCommon singleton sau đó được sử dụng bất cứ nơi nào trong ứng dụng của tôi như sau:

int user = [MyCommon singleton].user;
+1

Tôi đã đăng một vài năm trước đây và tôi đã học được một vài điều từ đó. Điều quan trọng để nhận ra về singletons là chúng không khác với các biến toàn cầu. Điều đó không nhất thiết có nghĩa là chúng nên tránh trong mọi trường hợp, nó chỉ có nghĩa là chúng có cùng nhược điểm, đặc biệt khi nói đến việc đóng gói thích hợp và dễ kiểm thử. Trong trường hợp này, ví dụ, nó trở nên rất khó khăn để kiểm tra các lớp riêng lẻ phụ thuộc vào '[MyCommon singleton]' trong sự cô lập mà không cần thiết lập giá trị 'user' toàn cục. –

+0

Một lựa chọn tốt cho singleton toàn cầu có thể truy cập là sử dụng tiêm phụ thuộc. Về cơ bản, bạn tạo ra cùng một đối tượng 'MyCommon' trong ủy nhiệm ứng dụng của bạn, và sau đó chuyển nó xuống bất kỳ đối tượng con nào cần nó, và sau đó tiếp tục quá trình này theo cách phân cấp đối tượng của bạn.Điều này cho biết thêm một chút công việc trên đường đi, nhưng nó kết quả trong một chương trình hướng đối tượng nhiều hơn, đó là dễ dàng hơn để duy trì và gỡ lỗi. –

+0

Để xem cộng đồng SO cảm thấy như thế nào về vấn đề này, đây là một liên kết đến câu hỏi tôi đã hỏi về những người độc thân khi tôi bắt đầu thực hiện chuyển đổi: http://stackoverflow.com/questions/474613 –

3

Thông thường, bạn sẽ hỏi điều khiển ứng dụng của bạn để biết thông tin này và nó sẽ chịu trách nhiệm biết cách lưu trữ/tìm kiếm nó trong bất kỳ mô hình dữ liệu nào tồn tại. Bộ điều khiển ứng dụng của bạn có thể hoặc có thể không giống như các ứng dụng ủy nhiệm (trong hầu hết các ứng dụng đơn giản, nó là như nhau).