2012-01-20 36 views
11

Im phát triển một ứng dụng phải chạy ẩn. Đó là một ứng dụng dựa trên vị trí, do đó, nó chạy tất cả các thời gian, hệ điều hành không giết nó.iphone - NSTimers ở chế độ nền

Nó sẽ gửi một số thông tin cứ 10 giây một lần (chỉ để gỡ lỗi), tôi đặt hẹn giờ khi nó ở chế độ nền. Tôi đặt một điểm ngắt trong hàm sẽ được thực hiện sau mỗi 10 giây, không bao giờ được gọi, nhưng nếu tôi tạm dừng ứng dụng và sau đó tiếp tục hẹn giờ được gọi, và sau đó bộ hẹn giờ được thực hiện sau mỗi 10 giây mà không gặp sự cố, phải không?

Tôi nghĩ rằng bộ hẹn giờ sẽ được thực hiện anyway khi tôi không gỡ lỗi, nhưng nó không phải là, cùng một điều như thể tôi đã không tạm dừng gỡ lỗi.

Câu hỏi của tôi là TẠI SAO ?? Bộ hẹn giờ được đặt chính xác (tôi giả định) vì nó hoạt động sau khi tạm dừng, nhưng không phải.

Bất kỳ ý tưởng nào?

Con đường tôi thiết lập bộ đếm thời gian là:

self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(doStuff) userInfo:nil repeats:YES]; 

Và trong hàm tôi kết nối với một webservice.

Cảm ơn.

+0

Đây là về bộ hẹn giờ, không gỡ lỗi; sửa tiêu đề của bạn, xin. Và là "khách quan-c" tốt nhất bạn có thể làm theo hướng gắn thẻ câu hỏi này? – matt

+0

có thể trùng lặp của [NSTimers chạy trong nền?] (Http://stackoverflow.com/questions/5901398/nstimers-running-in-background) – matt

Trả lời

20

Tôi có thiết kế ứng dụng tương tự và bị kẹt trên cùng một thứ. Những gì tôi thấy ở đâu đó trên internet là thêm kiểu này tuyên bố applicationDidEnterBackground:

UIBackgroundTaskIdentifier locationUpdater =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:locationUpdater]; 
     locationUpdater=UIBackgroundTaskInvalid; 
    } ]; 

này cho các os rằng bạn vẫn có những thứ xảy ra và không để ngăn chặn nó.

Tôi có hẹn giờ của tôi gắn liền với chức năng này

//this is a wrapper method to fit the required selector signature 
- (void)timeIntervalEnded:(NSTimer*)timer { 
    [self writeToLog:[NSString stringWithFormat:@"Timer Ended On %@",[NSDate date]]]; 
    [self startReadingLocation]; 
    [timer invalidate]; 
    timer=nil; 
} 

tôi đặt hẹn giờ tại địa điểm phương pháp quản lý đại biểu của tôi của tôi.

Tôi cảm thấy đau đớn của bạn. Tôi thấy rằng những thứ này cực kỳ khó hiểu. Đây là những gì làm việc cho tôi. Tôi hy vọng nó sẽ giúp. Tôi đã tìm thấy rằng không có bất kỳ hạn chế thực sự trong những gì bạn có thể làm trong nền.

+0

cảm ơn rất nhiều cwieland, nó hoạt động hoàn hảo. – subharb

+0

Thực ra nó không khắc phục được toàn bộ vấn đề của tôi. Bây giờ tôi nhận được một bản ghi sự cố, rõ ràng bởi vì tôi không kết thúc nhiệm vụ nền, và đó là bởi vì nhiệm vụ không bao giờ nên kết thúc miễn là ứng dụng đang ở chế độ nền. Các NStimer sẽ lặp lại endlesly. Điều đó có thể không? hoặc vì đó là một ứng dụng vị trí tôi nên móc các hành động vào GPS? – subharb

+0

Tôi không chắc chắn chính xác vụ tai nạn là gì. Tôi có thể duy trì kết nối ổ cắm ở chế độ nền nên tôi khá chắc chắn rằng bạn không bị giới hạn ở những thứ dựa trên vị trí. Nhưng như tôi đã nói những vấn đề này không phải là dễ nhất để giải quyết. Xin lỗi tôi không thể giúp đỡ nhiều hơn nữa. Bộ đếm thời gian của tôi sẽ chạy vô tận (theo như tôi đã xem) một điều cần kiểm tra là in ra backgroundTimeRemaining (nó không bao giờ nên đi xuống và rất lớn) – utahwithak

0

Có thể có những hạn chế về những gì bạn có thể làm trong nền. Hãy thử thêm bộ hẹn giờ vào vòng lặp chạy trước khi đi vào nền. Thậm chí điều đó có thể không hoạt động; có thể là mã duy nhất của bạn có thể chạy dưới nền là mã được gọi bằng các phương pháp Vị trí cốt lõi mà bạn đã đăng ký (ví dụ: locationManager:didUpdate...). Nhưng ấn tượng của tôi là giờ đã chạy trước khi bạn bắt đầu đi vào nền sẽ tiếp tục chạy.

+0

Nhưng điều đó không giải thích tại sao nếu tôi gỡ lỗi nó hoạt động. Đó là những gì tôi không hiểu. Tôi cho rằng ứng dụng hoạt động giống như cách gỡ lỗi hoặc chỉ chạy – subharb

+0

Tôi tin rằng nếu bạn đã thử những gì tôi đề xuất (thiết lập bộ hẹn giờ trong khi vẫn ở nền trước), nó sẽ giải quyết được vấn đề. Điều này thực tế có thể giống như giải pháp bạn đã chấp nhận. Vấn đề của bạn là bạn đã được nền và runloop của bạn đã ngừng chạy trước khi bạn thiết lập bộ đếm thời gian. Tạm dừng tại một điểm ngắt và tiếp tục trong khi nền cho phép runloop của bạn một cơ hội mới để chạy, do đó, tại thời điểm đó bộ đếm thời gian đã được thêm vào runloop. Đó là phỏng đoán nhưng tôi tin nó giải thích hiện tượng. – matt

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