2016-07-05 20 views
0

Also versuche ich, Dateien und Ordner mit Google Drive API zu holen.IOS GoogleDrive API - alle Dateien in Unterordnern mit 1 Ausführung erhalten

- (void)fetchFilesFrom:(NSString *)folderID remoteFolderPath:(NSString *)folderPath { 

GTLQueryDrive *query = [GTLQueryDrive queryForFilesList]; 
query.q = [NSString stringWithFormat:@"'%@' IN parents", folderID]; // get all files and folders under a parent folder 
query.fields = @"nextPageToken, files(id, name, mimeType, modifiedTime)"; // get files' and folders' name and id only 

[self.serviceDrive executeQuery:query 
       completionHandler:^(GTLServiceTicket *ticket, 
            GTLDriveFileList *fileList, 
            NSError *error) { 
        if (error == nil) { 
         for (GTLDriveFile *file in fileList.files) { 
          if ([file.mimeType containsString:@"vnd.google-apps.folder"]) { // folder not file 
           NSString *subFolderPath = [NSString stringWithFormat:@"%@/%@", folderPath, file.name]; 
           [self.driveDict setValue:file forKey:subFolderPath]; 
           // Create the folder locally if not existing 
           [DocumentHandler checkToCreateDir:subFolderPath]; 
           // Fetch files in a subfolder 
           [self fetchFilesFrom:file.identifier remoteFolderPath:subFolderPath]; 
          }else if(![file.mimeType containsString:@"vnd.google-apps."]) { 
           // Ignore other google files like speadsheet... as they are undownloadable 
           NSString *filePath = [NSString stringWithFormat:@"%@/%@", folderPath, file.name]; 
           [self.driveDict setValue:file forKey:filePath]; 
          } 
         } 

        /* If possible, I want to have the full driveDict here in order to compare. */ 

        } else NSLog(@"An error occurred: %@", error); 
       }]; 

}

Die obige Funktion funktioniert gut, aber ich will nicht rekursive Schleife verwenden, um alle Dateien in Unterordner zu erhalten. Gibt es eine Möglichkeit, alle Dateien im Original und seinen Unterordnern mit nur einer Ausführung zu erhalten?

Der Grund, warum ich das aufbringe, ist, dass ich die Liste der entfernten Dateien mit der lokalen Dateiliste vergleichen möchte, um unnötige lokale Dateien vor dem Herunterladen der Laufwerksdateien zu löschen. Und mit executeQuery:completionHandler:^{} Blöcke gibt mir keine Möglichkeit, serielle Ausführungen erfolgreich zu implementieren. Die Methoden innerhalb von Blöcken werden immer später ausgeführt.

Antwort

1

Weitere Informationen und detaillierte Schritte Im Folgenden finden Sie den Link für offizielle Website Google-Laufwerk https://developers.google.com/drive/ios/quickstart

- (void)fetchFiles { 
    self.output.text = @"Getting files..."; 
    GTLQueryDrive *query = 
    [GTLQueryDrive queryForFilesList]; 
    //query.pageSize = 10; /* Total number of files to get at once But useful only when there are more than hundreds of file to get once.*/ 
    query.fields = @"nextPageToken, files(id, name)"; 
    [self.service executeQuery:query 
       delegate:self 
      didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; 
} 
+0

Während dieser Link, um die Frage beantworten kann, ist es besser ist, die die wesentlichen Teile der Antwort auf gehören hier und stellen Sie den Link als Referenz zur Verfügung. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – Marusyk

+0

Ich habe dieses Tutorial tatsächlich immer wieder gelesen, bevor ich meine Frage gestellt habe. – Tim

+0

Mögen Sie die Antwort, die ich erneut gepostet habe, auschecken. Bitte lassen Sie mich detaillierte Hilfe benötigen. Ich kann dich Schritt für Schritt durchgehen. –

0
- (void)fetchFiles { 
    self.output.text = @"Getting files..."; 
    GTLQueryDrive *query = 
    [GTLQueryDrive queryForFilesList]; 
    //query.pageSize = 10; /* Total number of files to get at once But useful only when there are more than hundreds of file to get once.*/ 
    query.fields = @"nextPageToken, files(id, name)"; 
    [self.service executeQuery:query 
       delegate:self 
      didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; 
} 

Rufen Sie diese Methode die Dateien und Ordner alle sind in Laufwerken zu holen. Es listet Sie alle Ordner, Dateien einschließlich seiner Unterordner und Dateien in einem Anruf auf. In einem Wort alles im Stammordner.

0

Ihre Frage gleich me. Sie können unter Verwendung von Block :)

@property (nonatomic, copy) void(^blockHandler)(id data); 


// get list file 
- (void)listFiles:(NSString *)fileId complete:(void(^)(id data))completion { 
self.blockHandler = completion; 

GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query]; 
query.fields = @"nextPageToken, files(id, name, thumbnailLink, webViewLink)"; 
query.pageSize = 1000; 
query.q = [NSString stringWithFormat:@"'%@' In parents and trashed=false",fileId]; 

[self.service executeQuery:query 
        delegate:self 
     didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; 
} 

- (void)displayResultWithTicket:(GTLRServiceTicket *)ticket 
     finishedWithObject:(GTLRDrive_FileList *)result 
         error:(NSError *)error { 
if (error == nil) { 
    NSMutableString *output = [[NSMutableString alloc] init]; 
    if (result.files.count > 0) { 
     [output appendString:@"Files:\n"]; 
     for (GTLRDrive_File *file in result.files) { 
      itemGG *temp = [[itemGG alloc] initWithName:file.name linkThumb:file.thumbnailLink fileID:file.identifier]; 
      [self.lstItem addObject:temp]; 
      [output appendFormat:@"%@ (%@)\n", file.name, file.identifier]; 
     } 
    } else { 
     [output appendString:@"No files found."]; 
    } 
    NSLog(@"%@", output); 
} else { 
    NSLog(@"Error getting presentation data: %@\n", error.localizedDescription); 
} 

if (self.blockHandler) { 
    self.blockHandler([[NSArray alloc] initWithArray:self.lstItem]); 
} 
} 


__weak typeof(self) w = self; 
[self.cloud listFiles:@"root" complete:^(id data) { 
    w.tableData = data; 
    [w.myCollection reloadData]; 
}];