簡體   English   中英

內部提取后台執行EXEC_BAD_ACCESS的延遲

[英]Delay inside Background Fetch EXEC_BAD_ACCESS

我正在創建一個在后台模式下工作的應用程序(最小化),每隔90秒它就會執行某種檢查服務器上某些信息的方法。 代碼是這樣的:

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
...
}

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{

    MyFristViewController *viewController = (MyFristViewController *)self.window.rootViewController;

    [viewController checkData:^(UIBackgroundFetchResult result) {
        completionHandler(result);
    }];

}

MyFristViewController.m

-(void)checkData:(void (^)(UIBackgroundFetchResult))completionHandler{
...
NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        if(error == nil){   
            completionHandler(UIBackgroundFetchResultNewData);

        }else{
             completionHandler(UIBackgroundFetchResultNoData);
        }
    }];

    [dataTask resume];

    [self performSelector:@selector(checkData:) withObject:nil afterDelay:90.0];
...
}

我的代碼運行良好,但是正如我之前所說的,命令必須每90秒運行幾次,為此,方法的結尾使用了該命令,該命令可以優先執行:

[self performSelector:@selector(checkData:) withObject:nil afterDelay:90.0];

這段代碼中的問題是它第一次可以完美運行,現在,當他期望90秒並第二次運行相同的代碼時,我得到了錯誤消息EXEC_BAD_ACCESS這行代碼:

completionHandler(UIBackgroundFetchResultNewData);

現在,如果我刪除此行代碼,我會收到消息,並且我的應用程序運行良好(沒有任何崩潰):

應用程序委托收到了對-application:performFetchWithCompletionHandler:的調用,但從未調用完成處理程序。

我認為這對接收此消息不利,總之,我想做的是在應用程序最小化后,每90秒永遠運行一次此命令。 我做對了嗎?

您不能永遠在后台運行,iOS卻無法提供這種功能。

目前發生當機的原因是您在無效化之后多次呼叫完成處理常式。

基本上,您應該更改方法,可能還需要更改,並按照Apple的規定使用后台處理(因此,應基於用戶使用情況而不是明確的時間段)。

沒錯是正確的。 您的方法基本上與Apple關於背景和服務的願景相反。

更好的是服務器進行工作,並最終發送推送(靜默)通知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM