2010-03-22 30 views
7

Có lẽ nó chỉ là một thực tế rằng tôi đã sử dụng http://nodejs.org/ gần đây, nhưng việc thiếu đóng cửa trong Objective-C (iphone) đã được thực sự khó khăn để làm việc xung quanh.Đối phó với sự thiếu đóng cửa trong Objective-C

Ví dụ: tôi đang tạo các lớp dịch vụ. Mỗi lớp dịch vụ có thể có một số phương thức, mỗi phương thức tạo một yêu cầu URL khác nhau. Tôi có thể sử dụng mẫu ủy nhiệm, nhưng điều đó có nghĩa là tôi phải tạo một dịch vụ mới mỗi khi tôi muốn gọi một phương thức trên đó (vì nó phải lưu trữ đại biểu và bộ chọn cho yêu cầu đó, và các cuộc gọi phương thức mới sẽ ghi đè lên chúng) .

Thậm chí còn khó khăn hơn với tôi là tôi không thể dễ dàng giữ các biến cục bộ xung quanh trong phạm vi gọi lại. Tôi phải lưu trữ bất cứ điều gì tôi muốn gửi lại cho các đại biểu trên lớp dịch vụ chính nó, mà làm cho nó khó khăn hơn để có nhiều hơn một phương pháp trên mỗi lớp.

Bạn thích làm việc đó như thế nào? Tôi có nên bỏ việc rên rỉ và làm theo cách khác không?

+0

Tôi đoán một cách xấu xí để giải quyết cả hai là tạo các biến lớp cho mọi thứ tôi cần lưu trữ, như "methodOneDelegate" và "methodTwoDelegate" và "methodOneDataINeedToKeepAround". Bạn có được ý tưởng. –

Trả lời

10

Blocks, đã được giới thiệu vào Objective-C gần đây, cho phép đóng cửa. Vấn đề duy nhất là bạn không thể sử dụng chúng trên iPhone. Ở đây có giải pháp bên thứ 3, Plausible Blocks - chúng cũng mang lại khả năng này trên iPhone.

Cập nhật: dự án mẫu sử dụng các khối trên iPhone có thể được tìm thấy here.

+0

Nếu Plausible Blocks hoạt động, bạn sẽ nhận được sự ngưỡng mộ bất tận của tôi mãi mãi .... –

+0

Tôi không thấy bất kỳ mẫu mã nào trên trang web PB. Họ có chính xác cú pháp giống như các khối bình thường? –

+0

Tôi đã sử dụng chúng trong một vài dự án, nhưng họ đã không đưa nó vào App Store vì nhiều lý do khác nhau. Nhưng vì không sử dụng khung công tác riêng tư, tôi chắc chắn Apple sẽ không từ chối ứng dụng đó. – zakovyrya

7

Bất cứ lúc nào bạn thấy mình cần nhiều đại biểu, câu trả lời là thông báo.

Đối với thứ gì đó giống như lớp dịch vụ, bạn có thể tạo một singleton và thông báo cho các bên quan tâm khi yêu cầu dịch vụ hoàn tất qua thông báo.

Không phải là các khối không phải là một giải pháp thú vị cho vấn đề đó, nó chỉ là tôi cảm thấy bạn nên biết có những lựa chọn thay thế.

+0

Huh ... điều này giống như cực đối lập với cách tiếp cận mà tôi muốn thực hiện (không phải là xấu) vì các đóng cửa bản địa hóa thông tin, trong khi thông báo hoàn toàn toàn cầu. Hấp dẫn. –

+0

Tôi cho rằng các thông báo vốn đã là cục bộ, vì chỉ có các lớp tiêu thụ chúng mới biết chúng tồn tại. Họ chỉ xảy ra để đi du lịch trên một chiếc xe buýt toàn cầu ... Cùng một cách singletons xuất hiện toàn cầu, nhưng bạn sử dụng chúng để cô lập tham chiếu đến một hồ bơi của các đối tượng. –

+1

Mặc dù nó là một giải pháp, tôi nghĩ rằng nó nặng hơn so với sử dụng các khối, cả về mã hóa và hiệu suất. – zakovyrya

1

Tôi không phải là chuyên nghiệp, nhưng tôi đã phải vật lộn với vấn đề tương tự như vậy ở đây là tốt nhất mà tôi đã có cho đến nay:

@interface MyCallback : NSObject 
    id target; 
    SEL action; 
    id value1; 
    id value2; 
    ... 
@end 

Khi tôi cần phải gọi cái gì đó sẽ thông báo cho tôi về hoàn thành tôi điền vào mục tiêu và hành động với gọi lại thực tế (thường là "tự" và một phương thức) và các giá trị khác mà tôi sẽ cần sau đó vào giá trị1..2.3.3 Callee treo trên đối tượng MyCallback và khi đến lúc gọi nó mục tiêu/hành động và chuyển MyCallback làm tham số. Đó là cách tôi nhận được "đóng cửa" của tôi.

Để giải quyết vấn đề khác của bạn, đây là một ý tưởng: tạo một lớp có nguồn gốc từ NSURLConnection, được gọi là MYURLConenction và chỉ bổ sung là trường kiểu "id", gọi nó là MyStuff. Sau đó tiến hành sử dụng MYURLConenction thay vì NSURLConnection - khi bạn thực hiện một yêu cầu mạng, bạn có thể chèn dữ liệu của bạn (chẳng hạn như một thể hiện của MyCallback) vào MyStuff và nó sẽ treo vào chúng cho bạn. Do đó bạn sẽ không cần phải tạo một cá thể mới của lớp dịch vụ của bạn cho mỗi lời gọi. Điều này thực sự không phải là cách tôi làm điều đó mặc dù - Tôi chỉ đơn giản là tạo ra một lớp wrapper MyHTTPRequest chung là đại biểu của NSURLConnection, nó chấp nhận một cơ quan đăng ký URL & NSString, xử lý tất cả các công cụ mạng và trả về kết quả NSString và một NSError cho người gọi - một chút trừu tượng cao hơn. Nó cũng lưu trữ MyStuff, để các lớp dịch vụ có thể duy trì các singletones nếu chúng muốn.

+0

Vâng, tôi đã xem xét cách tiếp cận đó. Nó hoạt động tốt, nhưng phải cast và throw pass-through data trên callback là gây phiền nhiễu. Mặc dù ví dụ tôi đưa ra có thể không phải là trường hợp sử dụng hoàn hảo, các khối thực sự là cách tốt nhất để có một cuộc gọi lại giữ các biến xung quanh. Cảm ơn! –

+0

Chắc chắn, các khối sẽ tốt hơn. Cá nhân tôi chỉ là quá nhút nhát để sử dụng trình biên dịch bị tấn công (thần biết loại lỗi nào đang có) vì vậy tôi làm với các công cụ hiện có. – DenNukem

+0

Điều gì, bạn không muốn các lỗi ngẫu nhiên xuất hiện 6 tháng xuống đường? Cảm giác phiêu lưu của bạn ở đâu? : D –

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