相关疑难解决方法(0)

使用后台配置时,NSURLSessionTask在超时后永远不会回调

我正在使用NSURLSessionDownloadTask后台会话来实现我的所有REST请求.这样我可以使用相同的代码,而不必考虑我的应用程序在后台或前台.

我的后端已经死了一段时间了,我借此机会测试了NSURLSession超时的行为方式.

令我惊讶的是,我的NSURLSessionTaskDelegate回调都没有被调用过.无论我在上面NSURLRequest或上面设置什么超时NSURLSessionConfiguration,我都没有从iOS收到任何回调,告诉我请求确实以超时完成.

也就是说,当我开始NSURLSessionDownloadTask一个后台会话时.应用程序在后台或前台发生相同的行为.

示例代码:

- (void)launchDownloadTaskOnBackgroundSession {
    NSString *sessionIdentifier = @"com.mydomain.myapp.mySessionIdentifier";
    NSURLSessionConfiguration *backgroundSessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
    backgroundSessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringCacheData;
    backgroundSessionConfiguration.timeoutIntervalForRequest = 40;
    backgroundSessionConfiguration.timeoutIntervalForResource = 65;
    NSURLSession *backgroundSession = [NSURLSession sessionWithConfiguration:backgroundSessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.timeout.com/"]];
    request.timeoutInterval = 30;
    NSURLSessionDownloadTask *task = [backgroundSession downloadTaskWithRequest:request];
    [task resume];
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    NSLog(@"URLSession:task:didCompleteWithError: id=%d, error=%@", task.taskIdentifier, error);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用默认会话时,我会在30秒后收到错误回调(我在请求级别设置的超时).

示例代码:

- …
Run Code Online (Sandbox Code Playgroud)

ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask ios7.1

20
推荐指数
1
解决办法
1万
查看次数

Swift 3 ObjC在子类中不调用的可选协议方法

我有以下类层次结构:

class ScrollableViewController: UIViewController, UITableViewDelegate { // ... }
Run Code Online (Sandbox Code Playgroud)

这实现了一种UITableViewDelegate协议方法,例如tableView:willDisplayCellAt:

在我的SpecificScrollableViewController继承自的类中,ScrollableViewController新的可选协议方法不再被调用,例如tableView(_:heightForRowAt:)

cocoa-touch ios swift swift3 ios10

14
推荐指数
1
解决办法
4704
查看次数

如何在swift(XCode 8)中处理自定义url方案?

我尝试使用此函数从自定义URL接收参数:

func application(_ application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但是,该函数从未被调用,我收到警告:"实例方法"应用程序(:openURL:sourceApplication:annotation :)'几乎匹配协议'UIApplicationDelegate的可选参数'application(:open:sourceApplication:annotation :)'.

基于XCode 8警告"实例方法几乎匹配可选要求"我尝试使用@objc但没有成功.如何构建一个在打开应用程序时调用的函数,并从自定义URL方案中提供参数?

ios swift swift3

0
推荐指数
1
解决办法
3135
查看次数