做一個檢查,從谷歌獲得當前的時間和日期。 第一個選項是可行的,盡管它并不是最好的方法,因為它使用了一個貶值的方法,而且用同步方法等待一切完成并不是很好的用戶體驗。
-(NSDate*)timeAndDateFromWeb{
NSMutableURLRequest *request = [[NSMutableURLRequest allocation]
initWithURL:[NSURL URLWithString:@"https://google.co.uk"] ]。
[request setHTTPMethod:@"GET"]。
NSHTTPURLResponse *httpResponse = nil。
[NSURLConnection sendSynchronousRequest:request returningResponse:&httpResponse error:nil] 。
NSString *dateString = [[httpResponse allHeaderFields] objectForKey:@"Date"/span>]。
DebugLog(@" *** GOOGLE DATE: %@ ****"/span>,dateString);
if (httpResponse){
hasDataConnection = YES;
}
else{
hasDataConnection = NO;
}
//將字串轉換為日期物件。
NSDateFormatter *dateformatted = [NSDateFormatter new]。
[dateformatted setDateFormat:@"E, d MMM yyyy HH:mm:ss zzz" ]。
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"/span>]。
[dateformatted setLocale:locale]。
return [dateformatted dateFromString:dateString]。
嘗試適應它幾乎是有的,雖然我的日期字串回傳nil。[dateformatted dateFromString:dateString];/code>
NSURL *url = [NSURL URLWithString:@"https://google.co.uk"/span>] 。
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url] 。
NSOperationQueue *queue = [[NSOperationQueue alloc] init]。
NSHTTPURLResponse *httpResponse = nil;
NSString *dateString = [[httpResponse allHeaderFields] objectForKey:@"Date"] 。
[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler: ^(NSURLResponse *response, NSData *data, NSError *error) {
if (錯誤) {
hasDataConnection = NO;
//NSLog(@"
----> 未連接錯誤,%@", [錯誤本地化描述]);.
}
else {
//NSLog(@"
-----> connected: %@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
hasDataConnection = YES;
}
}];
//將字串轉換為日期物件。
NSDateFormatter *dateformatted = [NSDateFormatter new]。
[dateformatted setDateFormat:@"E, d MMM yyyy HH:mm:ss zzz" ]。
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"/span>]。
[dateformatted setLocale:locale]。
DebugLog(@" *** GOOGLE DATE: %@ ****", [dateformatted dateFromString:dateString])。
return [dateformatted dateFromString:dateString]。
uj5u.com熱心網友回復:
當你從同步切換到異步時,不能像以前一樣回傳值。
當你呼叫sendAsynchronousRequest方法時,它會啟動一個后臺任務,但你的執行緒會立即繼續作業。這就是為什么httpResponse和dateString都是null。
因此,你應該將你的回傳型別改為void,因為你不能立即回傳結果,并添加一個回呼,當作業完成時將會運行。并且在完成任務時也要處理你的格式化:
- (void)timeAndDateFromWeb:(void (^)(NSDate *)) completion {
NSURL *url = [NSURL URLWithString:@"https://google.co.uk"/span>]。
NSURLSessionTask *task = [NSURLSession.sharedSession
dataTaskWithURL:url
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (錯誤) {
// hasDataConnection = NO;
//NSLog(@"
----> 未連接錯誤,%@", [錯誤本地化描述]);
}
else if ( [response isKindOfClass:NSHTTPURLResponse.class] ) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSString *dateString = [[httpResponse allHeaderFields] objectForKey:@"Date"] 。
//將字串轉換為日期物件。
NSDateFormatter *dateformatted = [NSDateFormatter new]。
[dateformatted setDateFormat:@"E, d MMM yyyy HH:mm:ss zzz" ]。
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"/span>]。
[dateformatted setLocale:locale]。
// DebugLog(@" *** GOOGLE DATE: %@ ****", [dateformatted dateFromString:dateString]);
完成([dateformatted dateFromString:dateString])。
//NSLog(@"
-----> connected: %@", [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]);
// hasDataConnection = YES;
}
}];
[任務恢復]。
}
因此,這個方法的結果將被回傳到塊中,與后臺任務的結果相同。
別忘了,它將在后臺執行緒中被呼叫,與下載任務完成塊相同。因此,如果你想改變一些用戶界面,你需要移回主執行緒:
別忘了,它將在后臺執行緒中被呼叫,與下載任務完成塊相同。
[self timeAndDateFromWeb:^(NSDate *date) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", date) 。
//UI變化。
});
}];
另外,你可以把它移到函式內部的主執行緒中,就在回傳結果之前:
NSDate *date = [dateformatted dateFromString:dateString] 。
dispatch_async(dispatch_get_main_queue(), ^{
completion(date);
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/307438.html
標籤:
上一篇:分享圖片物件時,UIActivityViewController不顯示訊息選項
下一篇:Django管理的日期格式
