2012-05-24 25 views
14

Tôi đang phát triển một ứng dụng bằng API parse.com (chương trình phụ được lưu trữ cung cấp API để lưu dữ liệu trên máy chủ của họ). Tôi muốn có thể sử dụng ứng dụng liền mạch trực tuyến và ngoại tuyến. Đối với điều này tôi sẽ cần phải sử dụng một hàng đợi, nơi tôi có thể đặt các khối yêu cầu truy cập mạng. Khi mạng không khả dụng, các khối sẽ được thực thi serially và khi mạng đi offline, sau đó xử lý hàng đợi sẽ bị đình chỉ.ios: Hàng đợi trong nền và thực thi khi mạng khả dụng

Tôi đã nghĩ đến việc sử dụng GCD với tạm ngưng/tiếp tục khi mạng khả dụng/không khả dụng. Tôi đã tự hỏi nếu có bất kỳ lựa chọn tốt hơn? Điều này có hoạt động nếu ứng dụng được đặt trong nền không? Trường hợp tại điểm ở đây là người dùng lưu một số dữ liệu khi mạng không khả dụng (được xếp hàng đợi) và sau đó đặt ứng dụng ở chế độ nền. Bây giờ khi mạng trở nên có sẵn, có thể thực hiện việc lưu trong nền theo cách tự động không?

Trả lời

15

Tôi thực hiện chính xác những gì bạn đang hướng đến sử dụng NSOperationQueue. Đầu tiên, tạo một hàng đợi nối tiếp và đình chỉ nó theo mặc định:

self.operationQueue = [[[NSOperationQueue alloc] init] autorelease]; 
self.operationQueue.maxConcurrentOperationCount = 1; 
[self.operationQueue setSuspended:YES]; 

Sau đó, tạo một trường hợp reachability và đăng ký tham gia kReachabilityChangedNotification:

[[NSNotificationCenter defaultCenter] addObserver:manager 
             selector:@selector(handleNetworkChange:) 
              name:kReachabilityChangedNotification 
              object:nil]; 

[self setReachability:[Reachability reachabilityWithHostName:@"your.host.com"]]; 
[self.reachability startNotifier]; 

Bây giờ, bắt đầu và dừng lại hàng đợi của bạn khi thay đổi trạng thái mạng :

-(void)handleNetworkChange:(NSNotification *)sender { 
    NetworkStatus remoteHostStatus = [self.reachability currentReachabilityStatus]; 

    if (remoteHostStatus == NotReachable) { 
     [self.operationQueue setSuspended:YES]; 
    } 
    else { 
     [self.operationQueue setSuspended:NO]; 
    } 
} 

bạn có thể sắp xếp các khối của bạn với:

[self.operationQueue addOperationWithBlock:^{ 
    // do something requiring network access 
}]; 

Việc tạm dừng một hàng đợi sẽ chỉ ngăn các hoạt động bắt đầu - nó sẽ không tạm ngừng hoạt động. Luôn luôn có một cơ hội mà bạn có thể mất mạng trong khi một hoạt động đang thực thi, vì vậy bạn nên tính toán điều đó trong hoạt động của bạn.

+0

Tôi đang thử một cách tiếp cận như thế này nhưng tôi đang gặp rắc rối với "phạm vi ngoài phạm vi dealloc'd" khi kết nối trả về .. Bạn có gặp rắc rối khi gọi các khối của mình sau một chút không? Có vẻ như: "không thể khôi phục khung hiện tại" –

1

Bạn đã xem thư viện AFNetworking chưa? Tôi tin rằng nó có móc vào Reachabiltiy và có thể hành xử chính xác như bạn muốn.

+0

Cảm ơn. Tôi đã xem xét các AFNetworking lib nhưng nó có vẻ là nhiều hơn cho NSURL yêu cầu và không phải bất kỳ khối tùy ý mà tôi muốn bắt đầu thực hiện chỉ khi internet có sẵn (có thể sử dụng kết nối net chỉ cho một số phần của khối thực hiện). – Devang

+0

Tôi hiểu ý của bạn là gì ... câu trả lời về khả năng tiếp cận sẽ là ý nghĩ tiếp theo của tôi, btu tôi thấy ai đó đã ăn thịt ý tưởng đó. –

0

Tôi là một fan hâm mộ lớn của GCD và Blocks nhưng đối với điều này tôi sẽ xây dựng một giải pháp sử dụng NSOperationQueue. GCD là theo ý kiến ​​của tôi nhiều hơn cho các công cụ cấp thấp. Với NSOperationQueue bạn có khả năng hủy các hoạt động nhất định. Ngoài ra, bạn có thể thể hiện sự phụ thuộc vào các hoạt động khác (nếu điều này là cần thiết trong ứng dụng của bạn).

2

Khám phá -[PFObject saveEventually]. Điều này sẽ làm những gì bạn đang cố gắng để làm tự động và có thêm lợi ích của việc đàn hồi chống lại việc chấm dứt ứng dụng.

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