2011-12-27 23 views

Trả lời

14

Tùy thuộc vào những gì bạn đang cố gắng hoàn thành. Một trong những điều thú vị về các khối là chúng nắm bắt phạm vi địa phương. Bạn có thể đạt được cùng một kết quả cuối cùng với một hàm, nhưng cuối cùng bạn phải làm một cái gì đó giống như truyền xung quanh một đối tượng ngữ cảnh đầy đủ các giá trị có liên quan. Với một khối, bạn có thể làm điều này:

int num1 = 42; 
void (^myBlock)(void) = ^{ 
    NSLog(@"num1 is %d", num1); 
}; 

num1 = 0; // Changed after block is created 

// Sometime later, in a different scope 

myBlock();    // num1 is 42 

Vì vậy, chỉ đơn giản bằng cách sử dụng biến num1, giá trị của nó tại thời điểm myBlock được xác định được chụp.

Từ của Apple documentation:

Blocks là một lựa chọn hữu ích cho chức năng gọi lại truyền thống cho hai lý do chính:

  1. Chúng cho phép bạn viết mã tại thời điểm gọi đó là được thực hiện sau trong bối cảnh triển khai phương thức. Các khối là do đó thường là các tham số của các phương thức khung.

  2. Chúng cho phép truy cập vào các biến cục bộ. Thay vì sử dụng gọi lại yêu cầu cấu trúc dữ liệu thể hiện tất cả thông tin theo ngữ cảnh mà bạn cần thực hiện một thao tác, bạn chỉ cần truy cập trực tiếp vào các biến số cục bộ.

+0

Giải thích tuyệt vời. Tuy nhiên, tôi có một câu hỏi cho lý do 1. Lấy khối xử lý hoàn thành ví dụ. Nếu không có đa luồng liên quan đến, nghĩa là. phương pháp và khối của nó đều chạy trên hàng đợi chính, không có sự khác biệt giữa việc đặt mã hoàn thành bên trong khối và bên ngoài khối. Bởi vì mã hoàn thành sẽ chạy SAU khi phương thức kết thúc trong cả hai trường hợp. Nó có đúng không? – Philip007

+0

Vâng, đó là sự thật, nhưng có rất nhiều trường hợp một phương pháp cần thời gian để làm điều gì đó không đồng bộ, và làm như vậy mà không chặn luồng chính (không nhất thiết là đa luồng, xem NSRunLoop).Có ứng dụng mà cùng một phương pháp đôi khi có thể chạy đồng bộ và gọi khối hoàn thành trước khi nó trả về và các lần khác chạy không đồng bộ. Thật tuyệt khi cho phép cả hai khả năng mà không cần viết mã (gọi) khác nhau. Một điều nữa là các khối hoàn thành thường có các đối số, về cơ bản cho phép phương thức trả về nhiều giá trị. –

+0

Session 308 từ WWDC 2011 ("Blocks and GCD in Practice") nêu bật những ưu điểm của các khối trên các hàm bình thường (như được bao gồm trong câu trả lời này) với một ví dụ tốt để làm với phân loại. – Aky

4

Như Brad Larson ý kiến ​​để đáp ứng với this answer:

Blocks sẽ cho phép bạn xác định các hành động diễn ra để đáp ứng với một sự kiện , nhưng bạn chứ không phải đã viết một phương pháp hay chức năng riêng biệt, chúng cho phép bạn phải viết mã xử lý ngay nơi bạn thiết lập trình nghe cho sự kiện đó. Điều này có thể tiết kiệm một mớ mã và làm cho ứng dụng của bạn được tổ chức nhiều hơn.

Ví dụ điển hình mà tôi có thể cung cấp cho bạn là cảnh báo, sẽ tốt nếu tôi quyết định thời điểm tạo cảnh báo điều gì sẽ xảy ra khi tôi loại bỏ thay vì tôi viết phương thức đại biểu và chờ để gọi. Vì vậy, nó sẽ dễ dàng hơn nhiều để hiểu và thực hiện và nó cũng cung cấp xử lý nhanh chóng.

+4

Xin đừng viết những điều người khác đã viết ở nơi khác mà không trích dẫn chính xác. Điều này sẽ giúp bạn bị tạm ngưng từ trang web này rất nhanh chóng. –

+0

Vâng .. tôi sẽ làm điều đó trong tương lai ... có thể là điều bị bỏ lỡ trong thời gian gần đây nhất .. – rishi

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