Bạn không thể sử dụng khối hoàn thành để tạo giá trị trả lại cho phương thức của mình. AFJSONRequestOperation
hoạt động không đồng bộ. someFunction
sẽ trở lại trong khi thao tác vẫn hoạt động. Các khối thành công và thất bại là cách bạn nhận được các giá trị kết quả mà chúng cần đến.
Một tùy chọn ở đây là chuyển người gọi làm đối số cho phương thức trình bao bọc của bạn để Khối hoàn thành có thể giao mảng đó.
- (void)goFetch:(id)caller
{
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
[caller takeThisArrayAndShoveIt:[JSON valueForKey:@"posts"]];
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}
}
Bạn cũng có thể làm cho người gọi của mình tạo và vượt qua Chặn để chạy thành công. Sau đó, goFetch:
không còn cần biết thuộc tính nào tồn tại trên người gọi.
- (void)goFetch:(void(^)(NSArray *))completion
{
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success: ^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
if(completion) completion([JSON valueForKey:@"posts"]);
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {}
}
Nguồn
2013-07-14 19:07:37
Bạn không thể thực hiện việc này. Vì bạn đang đối phó với một cuộc gọi không đồng bộ, phương thức 'some function' của bạn sẽ trả về lâu trước khi có một giá trị trả về. – rmaddy
Tôi khuyên bạn nên lùi lại một bước và suy nghĩ về mã của bạn. Bạn sẽ sớm nhận ra rằng những gì bạn muốn không có ý nghĩa. –
bạn có thể vượt qua các khối để hoạt động sẽ thực hiện thành công hoặc lỗi. – stosha