2013-01-04 12 views
6

Tôi có một lớp học, trong đó có một hệ thống đại biểu dựa trên để gửi các loại yêu cầu khác nhau. nó sử dụng ủy nhiệm để cho đối tượng biết khi yêu cầu hoàn thành và cũng có thể nếu nó thành công o một lỗi.Làm thế nào để chuyển đổi một hệ thống gọi lại dựa trên đại biểu thành dựa trên khối?

Bây giờ, tôi cũng phải kiểm tra xem loại yêu cầu nào là phản hồi để thực hiện hành động thích hợp.

Tôi có lớp trình bao bọc nên cung cấp cho tôi một giao diện dựa trên khối giống nhau.

Tôi chuyển một khối hoàn thành và một khối lỗi đến một phương thức yêu cầu nên sử dụng nội bộ lớp này dựa trên đại biểu.

Và khi phản hồi đến, sẽ tự động gọi trình xử lý thích hợp cho loại yêu cầu đó và tùy thuộc vào thành công cũng như lỗi.

Tôi đã nhìn thấy một câu hỏi tương tự trên SO, nhưng đó là một chút không rõ ràng với tôi, Vì vậy, hãy đưa ra một ý tưởng chung về làm thế nào để đi về nó thay vì đánh dấu nó là trùng lặp ngay lập tức.

Trả lời

2

Đây là một cách để thực hiện. Sử dụng lớp RAExpendable này để tự động xây dựng đại biểu với việc triển khai dựa trên khối.

Hãy nói rằng đại biểu của bạn là:

@protocol XDelegate 
-(void) foo:(id)response; 
@end 

Thêm RAExpendable.h, RAExpendable.m từ https://github.com/evadne/RAExpendable để dự án của bạn. Tự động thêm các phương pháp đại biểu:

RAExpendable *expendable = [RAExpendable new]; 
    [expendable addMethodForSelector:@selector(foo:) types:"[email protected]:@" block:^(id x, SEL sel, id response){ 
     NSLog(@"response is %@", response); 
    }]; 

Và thiết lập các lớp expendable như đại biểu của bạn:

someObject.delegate = expendable; 

Bây giờ, nếu bạn làm điều này:

[expendable performSelector:@selector(foo:) withObject:@"OK"]; 

Bạn nhận được chuỗi response is OK. Thay thế NSLog bằng bất kỳ triển khai thành công/thất bại nào bạn thấy phù hợp. Từ giờ trở đi, khi bạn gọi số foo:, khối thực hiện thay thế.

Nếu bạn muốn sửa đổi điều này cho trường hợp sử dụng của bạn, lưu ý rằng các tham số cho ví dụ này là [email protected]:@, theo hướng dẫn của Type Encoding của thời gian chạy có nghĩa là: void return, self, SEL, object. selfSEL là hai tham số ẩn hiện diện trên mọi phương thức Objective-C, thông số thứ ba là tham số không được ẩn đầu tiên của phương thức. Chữ ký của khối phải khớp với chữ ký của phương thức.

+0

Bất kỳ ví dụ cho nhiều đối số? Ngoài ra tôi nhận được thông báo này khi gán 'RAExpendable' làm đại biểu:' Assigning to 'id ' từ kiểu không tương thích 'RAExpendable * __ strong'' – atulkhatri

2

Với REKit, bạn có thể làm cho một đại biểu động như dưới đây:

id dynamicDelegate; 
dynamicDelegate = [[NSObject alloc] init]; 
[dynamicDelegate respondsToSelector:@selector(foo:) withKey:nil usingBlock:^(id receiver, id response) { 
    NSLog(@"response is %@", response); 
}]; 
someObject.delegate = dynamicDelegate; 
+0

Làm việc cho tôi. Và tôi đánh giá cao việc không phải tự mình tìm ra các loại Objective-C! – EthanB

+0

P.S. @ Kazki, bạn quên thêm "tuyên bố từ chối quyền tác giả". ;) – EthanB