0

URL を文字列形式で処理して、可能性のある Retina イメージを取得するために、このコードを少し書きました。意図はそれがターンであることです

scheme://host/path/name.extension

の中へ

scheme://host/path/name@2x.extension

URL は予測可能であるため、たとえば「.」が 1 つだけであると仮定します。最終的なファイル名は安全です。しかし、これを行うにはコードが多すぎるのではないかと考えている iOS の感覚があります。これを行うためのより良い、おそらくAPI提供の方法はありますか?

これは、リクエストを開始するメソッドの始まりにすぎません。

- (NSData *)fetchResourceWithURLLocation:(NSString *)location
                             requestedBy:(id<DataRequestDelegate>)requester
                          withIdentifier:(id)requestID {

    NSData *resultData = nil;

    // some disassembly to get rid of the double '/' in scheme
    NSURL *locationURL = [NSURL URLWithString:location];
    NSString *host = [locationURL host];
    NSString *scheme = [locationURL scheme];
    NSString *dataPath = [locationURL relativePath];

    // if this is a retina display, rewrite the dataPath to use @2x
    if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0)) {

        NSArray *pathComponents = [dataPath componentsSeparatedByString:@"/"];
        NSString *nameComponent = [pathComponents lastObject];
        NSArray *nameComponents = [nameComponent componentsSeparatedByString:@"."];
        NSAssert(([nameComponents count] == 2), @"nameComponent contains more than one \".\"");
        nameComponent = [NSString stringWithFormat:@"%@@2x.%@", [nameComponents objectAtIndex:0], [nameComponents lastObject]];
        dataPath = @"";
        for(NSString *pathComponent in pathComponents) {
            if(pathComponent != [pathComponents lastObject])
                dataPath = [dataPath stringByAppendingString:[NSString stringWithFormat:@"%@/", pathComponent]];
        }
        dataPath = [dataPath stringByAppendingString:nameComponent];
    }

    // reassembly to check existence
    NSString *processedLocation = [NSString stringWithFormat:@"%@://%@%@", scheme, host, dataPath];
4

1 に答える 1