0

GData ObjCライブラリを使用して、iPhoneからYoutubeにビデオをアップロードしようとしています。

ライブラリを追加した後にプロジェクトをビルドしようとすると(ここにあります: svn checkout http://gdata-objectivec-client.googlecode.com/svn/trunk/gdata-objectivec-client-read-only)、エラー-GDataServiceBase.mのクラス'GDataHTTPUploadFetcher'のインターフェイス定義が重複しています。

ただし、新しいプロジェクトで同じことを行った場合、問題はまったく発生しません。すべてのインポートとプロジェクト設定を確認しましたが、すべて同じです。

このような問題を解決するには、何を探す必要がありますか?


追加情報 :

(私はカテゴリーについて完全に確信が持てないので、コメントでティルの質問の1つに答えるために)

GDataHTTPUploadFetcher.hでは、次のようにインターフェイスが設定されています。

@interface GDataHTTPUploadFetcher : GDataHTTPFetcher {

GDataHTTPFetcher *chunkFetcher_;
BOOL needsManualProgress_
NSURL *locationURL_;
// uploadData_ or uploadFileHandle_ may be set, but not both
NSData *uploadData_;
NSFileHandle *uploadFileHandle_;
NSInteger uploadFileHandleLength_;
NSString *uploadMIMEType_;
NSUInteger chunkSize_;
BOOL isPaused_;

.
.
.

}

+ (GDataHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request
                                      uploadData:(NSData *)data
                                  uploadMIMEType:(NSString *)uploadMIMEType
                                       chunkSize:(NSUInteger)chunkSize;

+ (GDataHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request
                                uploadFileHandle:(NSFileHandle *)fileHandle
                                  uploadMIMEType:(NSString *)uploadMIMEType
                                       chunkSize:(NSUInteger)chunkSize;

- (id)initWithRequest:(NSURLRequest *)request
       uploadData:(NSData *)data
 uploadFileHandle:(NSFileHandle *)fileHandle
   uploadMIMEType:(NSString *)uploadMIMEType
        chunkSize:(NSUInteger)chunkSize;

- (void)pauseFetching;
- (void)resumeFetchingWithDelegate:(id)delegate;
- (BOOL)isPaused;



@end

GDataHTTPUploadFetcher.mでは、次のようにインターフェイスが設定されています。

@interface GDataHTTPUploadFetcher (InternalMethods)
- (void)uploadNextChunkWithOffset:(NSUInteger)offset;
- (void)uploadNextChunkWithOffset:(NSUInteger)offset
            fetcherProperties:(NSDictionary *)props;
- (void)destroyChunkFetcher;

- (void)uploadFetcher:(GDataHTTPFetcher *)fetcher
     didSendBytes:(NSInteger)bytesSent
   totalBytesSent:(NSInteger)totalBytesSent
totalBytesExpectedToSend:(NSInteger)totalBytesExpected;

- (void)reportProgressManually;

- (NSUInteger)fullUploadLength;

// private methods of the superclass
- (void)invokeSentDataCallback:(SEL)sel
                    target:(id)target
           didSendBodyData:(NSInteger)bytesWritten
         totalBytesWritten:(NSInteger)totalBytesWritten
 totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;

- (void)invokeStatusCallback:(SEL)sel
                  target:(id)target
                  status:(NSInteger)status
                    data:(NSData *)data;

- (BOOL)invokeRetryCallback:(SEL)sel
                 target:(id)target
              willRetry:(BOOL)willRetry
                  error:(NSError *)error;
@end

GDataServiceBase.mでは、次のようにインターフェイスが設定されます。

@interface GDataHTTPUploadFetcher : GDataHTTPFetcher
+ (GDataHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request
                                      uploadData:(NSData *)data
                                  uploadMIMEType:(NSString *)uploadMIMEType
                                       chunkSize:(NSUInteger)chunkSize;
+ (GDataHTTPUploadFetcher *)uploadFetcherWithRequest:(NSURLRequest *)request
                                uploadFileHandle:(NSFileHandle *)uploadFileHandle
                                  uploadMIMEType:(NSString *)uploadMIMEType
                                       chunkSize:(NSUInteger)chunkSize;
- (void)pauseFetching;
- (void)resumeFetchingWithDelegate:(id)delegate;
- (BOOL)isPaused;
@end

ただし、問題は、このコードが既存のプロジェクトの1つでのみ問題を引き起こし、新しいプロジェクトでは問題を引き起こさないことです。

4

2 に答える 2

0

ターゲット->ビルドフェーズ->ソースのコンパイルGDataServiceBase.mに2回含まれている可能性があるかどうかを確認してください。その場合は、そのリストから1つの参照を削除します。

ここに画像の説明を入力してください

また、すべてのインポート/インクルードを徹底的にチェックし、それらに実装ファイル()が含まれている可能性があるかどうかを確認します.m。上のグローバル検索GDataServiceBase.mがその仕事をします。

ヘッダーのどこかでは#includeなく、を使用した可能性があります。これを行うと、ヘッダーまたはそのヘッダーを含む実装ファイル内の同じヘッダーの#import別のものが二重定義になります。ガード定義がなくても問題なく動作しますが、二重定義を防ぐためにガード定義が必要です。#include#import#include

コードを投稿すると、それが明らかになりました。あなたが引用しているそれらの情報源は、明らかに同じクラスを二重に定義しています。私はその理由を推測することしかできません。単純な悪いデザイン


最後に、原因

どうやら、まったく同じクラスを定義するGDataServiceBase.mだけでなく、次のようになります。それは確かに意味がありません。作者がなぜそれをしたのかについては答えられません。おそらく、それはもうコンパイルされていないはずの古い実装ファイルにすぎないのかもしれません。とにかく、最初のを含むブロック 全体を削除するだけです。3番目のインターフェース定義(内)は実際にカテゴリーを定義します-クラス/カテゴリー名のすぐ後ろに括弧が含まれているので見ることができます。そしてところで、元の作者はそれらに名前を付けるのではなく、単にブラケットを開閉する必要があります。しかし、ここにあるものはすべて彼のせいであり、あなたのせいではありません:D。GDataHTTPUploadFetcher.hGDataHTTPUploadFetcher@interfaceGDataServiceBase.m@endGDataHTTPUploadFetcher.m(InternalMethods)InternalMethods()

于 2012-04-29T09:37:38.677 に答える
0

すべてのコードを新しいプロジェクトに移動する必要があり、その後すべてが機能しました。

どうやら、プロジェクト設定で何かを台無しにしてしまったようです。

みんなの助けをありがとう。

于 2012-05-24T22:26:26.250 に答える