0

Obj-C クラスの 1 つの一部を iWatch でも実行できるように変換しようとしています。そのために、NSURLSession dataTaskWithRequest: の代わりに NSURLConnection sendAsynchronousRequest: を使用する必要があります。つまり、XML が正しく読み込まれて解釈されます)、元のコード内で、メイン プログラムのいくつかの NSNotification をトリガーして、目に見える変更を加えました。

NSURLSession completionHandler 内では、もう機能しないようです。

元のコードは次のとおりです。

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSDictionary *answer = [NSDictionary dictionaryWithXMLString:result];
    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_START_UPDATING object:nil userInfo:nil];
    /* DO SOME STUFF THERE */
    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_UPDATING_COMPLETE object:nil userInfo:answer];
}];

修正版は次のようになります。

NSURLSessionDataTask *subDataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSDictionary *answer = [NSDictionary dictionaryWithXMLString:result];
    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_START_UPDATING object:nil userInfo:nil];
    /* DO SOME STUFF THERE */
    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_UPDATING_COMPLETE object:nil userInfo:answer];
}];
[subDataTask resume];

クレイジーなのは、最初のバージョンでは正常に機能する2番目の方法を使用して、両方の通知が送受信されないことです。

同様に、別の同じ状況で、次のように呼び出されるタイマー呼び出しがあります。

if (autoRefresh)
    refreshTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(refreshInformationTimer:) userInfo:nil repeats:NO];

ここでも、NSURLConnection を使用して動作しますが、NSURLSessionDataTask 内では動作しません...

これについて私を助けてもらえますか?

どうもありがとう。

4

1 に答える 1

0

再現できません。このテストは問題なく動作します。試してみませんか?

- (void)test07
{
    static NSString * NotificationName = @"zekgnzerlkbnz";

    // Set an expectation that will be fullfill when we receive the notification
    XCTestExpectation * ex = [self expectationWithDescription:@"download ok"];
    [[NSNotificationCenter defaultCenter] addObserverForName:NotificationName
                                                      object:nil
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:^(NSNotification * _Nonnull note) {
                                                      [ex fulfill];
                                                  }];
    // Prep a download request
    NSURL * url = [NSURL URLWithString:@"http://www.google.com"];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];

    // Fire download. Send notif upon completion
    NSURLSessionDataTask *subDataTask = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        [[NSNotificationCenter defaultCenter] postNotificationName:NotificationName object:nil userInfo:nil];

    }];
    [subDataTask resume];

    // Wait for 10 second or for exp to be fullfilled
    [self waitForExpectationsWithTimeout:10
                                 handler:^(NSError * _Nullable error) {
                                     XCTAssert(error == nil);
                                 }];
}
于 2016-08-15T17:43:00.517 に答える