2009-08-19 32 views
7

Tôi có ứng dụng IPhone sử dụng dịch vụ web để nhận dữ liệu từ máy chủ. Tôi đang đặt mỗi cuộc gọi đến webservice trong một lớp con NSOperation để nó có thể được tạo luồng. Câu hỏi của tôi là, cách được khuyến nghị để trả lại thông tin từ một lớp con NSOperation đã hoàn thành là gì. Tôi hiện đang gửi NSNotification ở cuối phương thức chính và bất kỳ mã nào đang chờ NSOperation hoàn tất, đăng ký thông báo. Và sau đó tôi sẽ sử dụng một phần đối tượng của NSNotificationWithName: Object: để truyền thông tin trở lại từ hoạt động.Ca cao - Trả lại thông tin từ NSOperation

Tôi không chắc chắn có cách nào tốt hơn để thực hiện việc này hay không. Tôi đã nghe nói về Key Value Coding và sau đó tôi có thể sử dụng Key Value Observing để phát hiện khi thuộc tính isFinished cho hoạt động được thay đổi, nhưng tôi không chắc thực hành tốt nhất là gì.

Tôi cũng đang cố gắng đảm bảo rằng ứng dụng của mình là an toàn, mà tôi cho rằng sẽ không là vấn đề miễn là thông báo của tôi được gửi ở cuối phương thức chính, do đó đối tượng trong thông báo sẽ không còn được sử dụng trong chuỗi vì nó sẽ kết thúc.

Cuối cùng, tôi kêu gọi các thông báo như sau:

[[NSNotificationCenter defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:[NSNotification notificationWithName:@"notificationName" object:dataObject] waitUntilDone:NO]; 

Trả lời

16

Cá nhân tôi đã thực hiện việc này theo hai cách. Cả hai đều hoạt động khá tốt.

Đầu tiên Way

Bạn có thể có một hàm trả về "đầu ra", và bạn gọi hàm sau ca phẫu thuật đã hoàn tất. Bạn có thể quan sát phím isFinished trên đối tượng NSOperation hoặc sử dụng -[NSOperationQueue waitUntilAllOperationsAreFinished] để xác định thời điểm hoạt động hoàn tất.

Thứ hai Way

Bạn có thể sử dụng một đại biểu hoặc mục tiêu/hành động từ NSOperation. Chỉ cần đảm bảo rằng khi bạn gọi hàm đại biểu hoặc kích hoạt mục tiêu/hành động, bạn làm như vậy trên chuỗi chính bằng cách sử dụng -[NSObject performSelectorOnMainThread:withObject:waitUntilDone:]

1

Nó phụ thuộc vào ứng dụng của bạn. Có bao nhiêu hoạt động bạn mong đợi để chạy đồng thời? Bạn đang làm gì với kết quả? Kết quả có được tổng hợp hay chúng cần hiển thị trong giao diện người dùng ngay lập tức không?

Gửi thông báo trên chuỗi chính khá nặng. Tùy thuộc vào những gì bạn đang làm với kết quả, bạn có thể làm hỏng UI của bạn. Từ quan điểm thiết kế, là các đối tượng mà bạn sẽ gửi từ thông báo mà lớp quan sát cần biết? Nó có thể có ý nghĩa hơn để thực hiện thay đổi đối tượng mô hình của bạn từ hoạt động và có một đối tượng điều khiển quan sát những thay đổi đó thay thế.

Bạn có thể sử dụng Quan sát giá trị khóa nhưng bạn phải cẩn thận. Người quan sát quan sát trong cùng một luồng mà thay đổi xảy ra, vì vậy bạn không nên thực hiện thay đổi giao diện người dùng trực tiếp khi quan sát được hoàn thành.

Nếu đối tượng chỉ được sở hữu và sử dụng bởi thao tác, thì có, nó sẽ an toàn để gửi vào cuối chính. Nó sẽ được giữ lại bởi thông báo.

0

Tài liệu nói rằng tốt hơn là tạo biến thành viên hoạt động khi bạn muốn nhận kết quả từ hoạt động. Nhưng tôi không nghĩ rằng giải pháp sẽ thích ứng với bạn.

Tôi nghĩ rằng thông báo là tốt và có một cách khác để có được kết quả là tạo khối hoàn thành cho hoạt động của riêng bạn.Xem tại đây: Return data from NSOperation? Tôi đã thử nó hoạt động tốt.

Tôi đã thử một cách khác trước khi đặt khối hoàn thành hoạt động và thực hiện tham chiếu yếu đến hoạt động và làm cho kết quả là thuộc tính hoạt động. vì vậy bạn có thể nhận được kết quả hoạt động khi bạn hoàn thành.

Nhưng hoàn tất không đáng tin cậy, khi bạn hủy thao tác, quá trình hoàn thành cũng được loại bỏ. vì vậy hãy chọn điều tốt nhất cho bạn.

+0

tài liệu là bạn có thể thích nó. – frank